无法在web.api中获取客户端IP地址

时间:2015-06-16 15:21:55

标签: c# asp.net-web-api ip-address

我正在建立一个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指令或程序集引用?)

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

根据异常消息,它说Request的类型为System.Web.HttpRequestBaseProperties不存在,这对于该类来说是准确的。这看起来像是在混合使用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