无法在 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 指令或程序集引用?
我在这里错过了什么?
根据异常消息,它说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();
}
}
你应该添加引用 系统.服务模型 和 系统.服务模型.通道