2012-12-15 40 views

回答

5

那麼,最近在SignalR項目(特別是this one)上的提交中,我發現如何去做。

protected string GetIpAddress() 
{ 
    var env = Get<IDictionary<string, object>>(Context.Request.Items, "owin.environment"); 
    if (env == null) 
    { 
     return null; 
    } 
    var ipAddress = Get<string>(env, "server.RemoteIpAddress"); 
    return ipAddress; 
} 

private static T Get<T>(IDictionary<string, object> env, string key) 
{ 
    object value; 
    return env.TryGetValue(key, out value) ? (T)value : default(T); 
} 
+0

詢問有關計算器上的Dev分支問題變得毫無意義,因爲羣衆會不知道你在說什麼。只是一個FYI – davidfowl

+0

@dfowler - 授予 - 但我一直試圖避免提出這些問題作爲你的GitHub上的「問題」,因爲我已經看到你咀嚼其他人試圖使用它們的目的: )。有更好的選擇嗎? –

+1

當它是這樣的時候使用github。沒有人能在這裏回答你。開發分支是不是你可以預測的東西,所以答案總是錯的,我寧願沒有在公衆 – davidfowl

5

我沒有與自託管SignalR集線器嘗試,但與SignalR 2.0,Context.Request沒有Items了(至少不是我所看到的)。我想通了,現在它是如何工作的。 (您可以的if/else部分減少到三元運算符,如果你喜歡這一點。)

protected string GetIpAddress() 
{ 
    string ipAddress; 
    object tempObject; 

    Context.Request.Environment.TryGetValue("server.RemoteIpAddress", out tempObject); 

    if (tempObject != null) 
    { 
     ipAddress = (string)tempObject; 
    } 
    else 
    { 
     ipAddress = ""; 
    } 

    return ipAddress; 
} 
+3

作爲單線程的另一種形式是'Context.Request.Environment [「server.RemoteIpAddress」]。ToString();' –