将IP地址添加到HttpRequestMessage
如何为HttpRequestMessage添加IP地址?
我正在为Web.API应用程序编写unit testing,我有一个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”]为空,我无法执行测试。
以下解决方案 – 看看我自己的答案。
感谢Davin的建议。
这是解决方案 –
private HttpRequestMessage CreateRequest(string url, string mthv, HttpMethod method) { var request = new HttpRequestMessage(); var baseRequest = new Mock(MockBehavior.Strict); var baseContext = new Mock(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;
您似乎正在尝试从主机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; }
- WebAPI POST 没有绑定
- 获取属性路由模板列表asp.net webapi 2.2
- ASP.NET 5,MVC6,WebAPI – > ModelState.IsValid始终返回true
- Web API中DefaultControllerFactory的等价物是什么?
- WebApi XML反序列化 – 具有多个子节点的节点未正确反序列化为子节点对象数组
- 在Web.API控制器中自动反序列化为类似字符串的类
- 如何在entity framework中处理System.InvalidOperationException?
- 名为“DefaultRoute”的路径已在路径集合中。 路线名称必须是唯一的
- 我可以在具有不同复杂参数类型的Web API中使用多个POST方法吗?