2014-01-29 117 views
4

自託管中不支持HttpContext。使用web api自託管獲取客戶端的IP地址

當我跑我的自我託管的內存集成測試那麼這段代碼無法正常工作或:

// OWIN Self host 
var owinEnvProperties = request.Properties["MS_OwinEnvironment"] as IDictionary<string, object>; 
if (owinEnvProperties != null) 
{ 
    return owinEnvProperties["server.RemoteIpAddress"].ToString(); 
} 

owinEnvProperties總是空。

那麼我該如何使用自託管獲得客戶IP地址?

+0

你使用的是「內存中」還是「自主」?由於沒有網絡交互,因此執行「內存」操作時不會有IP地址。 –

+0

我的集成測試不啓動owin主機,而是在內存中測試web api請求管道。好吧,我認爲我至少得到了本地主機,但你應該從哪裏來:p – Pascal

+0

「因爲沒有網絡交互」那麼我必須真正重新思考我是否希望使用新的HttpSelfHostServer進行快速內存中測試或真正的自我主機測試(配置).OpenAsync()等...然後HttpServer給我什麼,除了錯誤和解決方法... – Pascal

回答

3
const string OWIN_CONTEXT = "MS_OwinContext"; 

if (request.Properties.ContainsKey(OWIN_CONTEXT)) 
{ 
    OwinContext owinContext = request.Properties[OWIN_CONTEXT] as OwinContext; 
    if (owinContext != null) 
     return owinContext.Request.RemoteIpAddress; 
} 
+0

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web .http.Owin/OwinHttpRequestMessageExtensions.cs這個MVC是隻有? – Pascal

9

基於this,我認爲比較先進的日期和優雅的解決辦法是做到以下幾點:

string ipAddress; 
Microsoft.Owin.IOwinContext owinContext = Request.GetOwinContext(); 
if (owinContext != null) 
{ 
    ipAddress = owinContext.Request.RemoteIpAddress; 
} 

,或者,如果你不關心測試空OWIN上下文中,你可以使用這個單行:

string ipAddress = Request.GetOwinContext().Request.RemoteIpAddress;