湖上湖
该解决方案还涵盖了使用Owin自托管的Web API。部分地从这里。您可以在其中创建一个私有方法,ApiController无论您如何托管Web API,该方法都将返回远程IP地址: private const string HttpContext = "MS_HttpContext"; private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; private const string OwinContext = "MS_OwinContext"; private string GetClientIp(HttpRequestMessage request) { // Web-hosting if (request.Properties.ContainsKey(HttpContext )) { HttpContextWrapper ctx = (HttpContextWrapper)request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } // Self-hosting if (request.Properties.ContainsKey(RemoteEndpointMessage)) { RemoteEndpointMessageProperty remoteEndpoint = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } // Self-hosting using Owin if (request.Properties.ContainsKey(OwinContext)) { OwinContext owinContext = (OwinContext)request.Properties[OwinContext]; if (owinContext != null) { return owinContext.Request.RemoteIpAddress; } } return null; }所需参考资料:HttpContextWrapper -System.Web.dllRemoteEndpointMessageProperty -System.ServiceModel.dllOwinContext -Microsoft.Owin.dll(如果使用Owin包,则已经有了)此解决方案的一个小问题是,当您在运行时实际上只使用其中的一种情况时,必须为所有3种情况加载库。作为建议在这里,这可以通过使用可以克服dynamic变量。您也可以将GetClientIpAddress方法编写为的扩展HttpRequestMethod。using System.Net.Http;public 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 GetClientIpAddress(this HttpRequestMessage request) { // Web-hosting. Needs reference to System.Web.dll if (request.Properties.ContainsKey(HttpContext)) { dynamic ctx = request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } // Self-hosting. Needs reference to System.ServiceModel.dll. if (request.Properties.ContainsKey(RemoteEndpointMessage)) { dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } // Self-hosting using Owin. Needs reference to Microsoft.Owin.dll. if (request.Properties.ContainsKey(OwinContext)) { dynamic owinContext = request.Properties[OwinContext]; if (owinContext != null) { return owinContext.Request.RemoteIpAddress; } } return null; }}现在您可以像这样使用它:public class TestController : ApiController{ [HttpPost] [ActionName("TestRemoteIp")] public string TestRemoteIp() { return Request.GetClientIpAddress(); }}