Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IP地址添加到HttpRequestMessage_C#_Unit Testing_Asp.net Web Api - Fatal编程技术网

C# 将IP地址添加到HttpRequestMessage

C# 将IP地址添加到HttpRequestMessage,c#,unit-testing,asp.net-web-api,C#,Unit Testing,Asp.net Web Api,如何向HttpRequestMessage添加IP地址 我正在为Web.API应用程序编写单元测试,我有一个authorized属性来检查调用方的IP地址- string[] AllowedIPs = new string[] { "127.0.0.1", "::1" } string sourceIP = ""; var contextBase = actionContext.Request.Properties["MS_HttpContex

如何向HttpRequestMessage添加IP地址

我正在为Web.API应用程序编写单元测试,我有一个authorized属性来检查调用方的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;

但是actionContext.Request.Properties[“MS_HttpContext”]为null,我无法执行测试


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

似乎您正在尝试从主机
myserver
获取IP地址,在这种情况下,任何问题都无法解决。这将使属性
MS_HttpContext
null

我建议采用不同的方法。首先,模拟
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;
    } 

谢谢戴文的建议

以下是解决方案-

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;
} 
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;