You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何让Mock的HttpMessageHandler按请求URL返回对应模拟响应

实现方法

你只需修改SendAsync方法的匹配规则,将原有ItExpr.IsAny<HttpRequestMessage>()的全匹配,改为针对请求地址的定向匹配即可,修改后的完整代码如下:

// 新增targetUrl入参,传入需要绑定的指定请求地址
public static HttpClient GetMockedHttpClient(string targetUrl, string responseContent, HttpStatusCode httpStatusCode)
{
    var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict);
    handlerMock
       .Protected()
       .Setup<Task<HttpResponseMessage>>(
            "SendAsync",
            // 仅匹配RequestUri和指定地址一致的请求
            ItExpr.Is<HttpRequestMessage>(req => req.RequestUri == new Uri(targetUrl)),
            ItExpr.IsAny<CancellationToken>()
        )
       .ReturnsAsync(new HttpResponseMessage()
        {
            StatusCode = httpStatusCode,
            Content = new StringContent(responseContent),
        })
       .Verifiable();
    return new HttpClient(handlerMock.Object);
}
常见扩展匹配规则

可以根据业务需要调整ItExpr.Is中的判断逻辑,实现更灵活的匹配:

  • 忽略大小写匹配地址:req => req.RequestUri.ToString().Equals(targetUrl, StringComparison.OrdinalIgnoreCase)
  • 匹配指定域名下的所有请求:req => req.RequestUri.Host == "api.example.com"
  • 匹配特定路径前缀的所有请求:req => req.RequestUri.AbsolutePath.StartsWith("/v1/user")

注意:如果你的代码中是用相对路径发起请求,需要提前给生成的HttpClient赋值BaseAddress属性,或者在匹配逻辑中拼接BaseAddress和相对路径后再做对比。


内容的提问来源于stack exchange,提问作者DaveVentura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:15:05