【问题标题】:Add IP address to HttpRequestMessage将 IP 地址添加到 HttpRequestMessage
【发布时间】:2013-03-03 18:43:11
【问题描述】:

如何向 HttpRequestMessage 添加 IP 地址?

我正在为 Web.API 应用程序编写单元测试,我有一个 AuthorizeAttribute 来检查调用者的 IP 地址 -

        string[] AllowedIPs = new string[] { "127.0.0.1",  "::1" }
        string sourceIP = "";

        var contextBase = actionContext.Request.Properties["MS_HttpContext"] as System.Web.HttpContextBase;

        if (contextBase != null)
        {
            sourceIP = contextBase.Request.UserHostAddress;
        }

        if (!string.IsNullOrEmpty(sourceIP))
        {
            return AllowedIPs.Any(a => a == sourceIP);
        }
        return false;

我构造一个测试请求如下 -

    var request = CreateRequest("http://myserver/api/CustomerController, "application/json", HttpMethod.Get);            
    HttpResponseMessage response = client.SendAsync(request).Result;

。 .

    private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
    {
        var request = new HttpRequestMessage();
        request.RequestUri = new Uri(url);
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
        request.Method = method;
        return request;
    } 

但 actionContext.Request.Properties["MS_HttpContext"] 为空,我无法执行测试。

以下解决方案 - 查看我自己的答案。

【问题讨论】:

    标签: c# unit-testing asp.net-web-api


    【解决方案1】:

    感谢 Davin 的建议。

    这是解决方案 -

    private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
    {
        var request = new HttpRequestMessage();
    
        var baseRequest = new Mock<HttpRequestBase>(MockBehavior.Strict);
        var baseContext = new Mock<HttpContextBase>(MockBehavior.Strict);
    
        baseRequest.Setup(br => br.UserHostAddress).Returns("127.0.0.1");
        baseContext.Setup(bc => bc.Request).Returns(baseRequest.Object);
    
    
        request.RequestUri = new Uri(url);
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
    
        request.Properties.Add("MS_HttpContext", baseContext.Object);
    
        request.Method = method;
        return request;
    } 
    

    然后按以下方式使用该方法 -

     var request = CreateRequest("http://myserver/api/CustomerController, "application/json", HttpMethod.Get);            
     HttpResponseMessage response = client.SendAsync(request).Result;
    

    【讨论】:

      【解决方案2】:

      您似乎正试图从主机myserver 获取IP 地址,在这种情况下不会被任何东西解析。这使属性 MS_HttpContext 为空。

      我会建议一种不同的方法。首先,模拟System.Web.HttpContextBase 并为Request.UserHostAddress 设置返回值,然后,在您的测试设置中,直接设置属性:

      private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method)
          {
              var request = new HttpRequestMessage();
              request.RequestUri = new Uri(url);
              request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mthv));
              request.Method = method;
              request.Property["MS_HttpContext"] = mockedHttpContextBase //here
              return request;
          } 
      

      【讨论】:

        猜你喜欢
        • 2013-11-05
        • 2015-05-22
        • 1970-01-01
        • 2018-12-23
        • 2021-05-23
        • 2018-09-02
        • 2018-04-26
        • 1970-01-01
        • 2015-08-18
        相关资源
        最近更新 更多