在使用 Owin 自托管的 Web API 中获取远程主机 IP
Posted
技术标签:
【中文标题】在使用 Owin 自托管的 Web API 中获取远程主机 IP【英文标题】:Get Remote Host IP in Web API Self-Hosted Using Owin 【发布时间】:2013-11-19 19:30:48 【问题描述】:我需要一个非常简单的东西——在 Web API 控制器中获取远程主机 IP 地址。 This 帖子描述了当您是网络托管或自托管时如何执行此操作。不幸的是,所描述的解决方案不适用于Web API self-hosted using Owin(好吧,我无法让它工作:))。我使用 Windows 服务来托管 Web API。
所以,问题是:如何使用 Owin 在 Windows 服务中自托管的 Web API 控制器中获取远程主机 IP 地址?
我需要远程 IP 地址的控制器:
internal class ItemController : ApiController
[HttpPost]
public HttpResponseMessage AddItem([FromBody] string data)
// Need to get remote host IP address here
return Request.CreateResponse(HttpStatusCode.OK);
启动配置 Web API 的类:
internal class StartUp
public void Configuration(IAppBuilder appBuilder)
var httpConfig = new HttpConfiguration();
httpConfig.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
appBuilder.UseWebApi(httpConfig);
我使用 Windows 服务来托管 Web API。下面是服务的 OnStart 方法:
protected override void OnStart(string[] args)
var baseAddress = "http://localhost:5550/";
// Start OWIN
WebApp.Start<StartUp>( url: baseAddress );
谢谢!
【问题讨论】:
【参考方案1】:您应该能够通过执行以下操作来获得它:
OwinContext owinContext = (OwinContext)webapiHttpRequestMessage.Properties["MS_OwinContext"];
string ipaddress = owinContext.Request.RemoteIpAddress;
【讨论】:
太好了,谢谢!我正在研究 OwinContext.Environment。【参考方案2】:这是我在 Owin 控制器 (System.Web.Http.Owin v5.2.7) 中的操作方式:
var ctx = Request.Properties["MS_OwinContext"] as OwinContext;
if (ctx != null)
var ip = ctx.Request.RemoteIpAddress;
var port = ctx.Request.RemotePort;
LogInfo($"Remote caller = ip:port");
【讨论】:
以上是关于在使用 Owin 自托管的 Web API 中获取远程主机 IP的主要内容,如果未能解决你的问题,请参考以下文章
asp.net web api 自托管 / owin / katana
具有 OWIN 自托管的 Web API 无类型 OData 服务返回 406 Not Acceptable
支持 https 的 Owin 自托管控制台应用程序(无 Web api,无 SignalR)
具有 OWIN 自主机和 Windows 身份验证的 Web Api