6

HttpRequestMessage に IP アドレスを追加するにはどうすればよいですか?

Web.API アプリケーションの単体テストを作成しています。呼び出し元の IP アドレスをチェックする AuthorizeAttribute があります。

        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"] は null で、テストを実行できません。

以下の解決策- 私自身の答えを見てください。

4

2 に答える 2

12

彼の提案をしてくれた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;
于 2013-03-04T02:01:57.813 に答える
4

ホストから IP アドレスを取得しようとしているようですがmyserver、この場合は何も解決されません。これにより、プロパティはMS_HttpContextnull のままになります。

別のアプローチをお勧めします。まず、 の戻り値をモック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-03-03T22:39:51.807 に答える