无法在 Web.API 中获取客户端 IP 地址

本文关键字:获取 客户端 IP 地址 API Web | 更新日期: 2023-09-27 17:56:38

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

我在这里错过了什么?

无法在 Web.API 中获取客户端 IP 地址

根据异常消息,它说Request属于 System.Web.HttpRequestBase 类型,Properties不存在,这对于该类来说是准确的。这看起来像您正在混合MVC和WebApi控制器。

您引用的System.Web.HttpRequestBase Request是 MVC Controller.Request的一部分,但您的方法结构看起来像是 Web API System.Web.Http.ApiController的一部分,该 Web API 也具有 System.Web.Http.HttpRequestMessage Request 属性。

确保从正确的控制器继承。

public class BooksController : System.Web.Http.ApiController {...}

我已使用此扩展帮助程序获取具有ApiController的客户端 ip

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

你应该添加引用 系统.服务模型 和 系统.服务模型.通道