我正在建立一个Web.Api(mvc& web.api)并尝试使用此代码获取客户端ip地址..
[System.Web.Http.HttpPut]
public HttpResponseMessage Update([FromBody] BookInformation bookStatus)
{
// Stuff...
// Retrieve clients IP#
var clientIp = (System.Web.HttpContextWrapper)Request.Properties["MS_HttpContext"]).Request.UserHostAddress
}
但是我收到了这个错误:
' System.Web.HttpRequestBase'不包含的定义 '属性'并且没有扩展方法'属性'接受第一个 类型' System.Web.HttpRequestBase'的参数可以找到(是你 缺少using指令或程序集引用?)
我在这里缺少什么?
答案 0 :(得分:1)
根据异常消息,它说Request
的类型为System.Web.HttpRequestBase
且Properties
不存在,这对于该类来说是准确的。这看起来像是在混合使用MVC和WebApi控制器。
您引用的System.Web.HttpRequestBase Request
是MVC Controller.Request
的一部分,但您的方法结构看起来好像是属于{A System.Web.Http.ApiController
的Web Api System.Web.Http.HttpRequestMessage Request
的一部分财产也是如此。
确保从正确的控制器继承。
public class BooksController : System.Web.Http.ApiController {...}
我已经使用此扩展助手来获取客户端ip ApiController
static class HttpRequestMessageExtensions {
private const string HttpContext = "MS_HttpContext";
private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";
private const string OwinContext = "MS_OwinContext";
public static string GetClientIpString(this HttpRequestMessage request) {
//Web-hosting
if (request.Properties.ContainsKey(HttpContext)) {
dynamic ctx = request.Properties[HttpContext];
if (ctx != null) {
return ctx.Request.UserHostAddress;
}
}
//Self-hosting
if (request.Properties.ContainsKey(RemoteEndpointMessage)) {
dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null) {
return remoteEndpoint.Address;
}
}
//Owin-hosting
if (request.Properties.ContainsKey(OwinContext)) {
dynamic ctx = request.Properties[OwinContext];
if (ctx != null) {
return ctx.Request.RemoteIpAddress;
}
}
if (System.Web.HttpContext.Current != null) {
return System.Web.HttpContext.Current.Request.UserHostAddress;
}
// Always return all zeroes for any failure
return "0.0.0.0";
}
}
并像这样使用
public class BooksController : System.Web.Http.ApiController {
[System.Web.Http.HttpPut]
public HttpResponseMessage Update([FromBody] BookInformation bookStatus) {
// Stuff...
// Retrieve clients IP#
var clientIp = Request.GetClientIpString();
}
}
答案 1 :(得分:1)
你应该添加参考 System.ServiceModel 和 System.ServiceModel.channel