是否可以通过 HubCallerContext 获取调用者的 IP 地址?还是我必须通过 HttpContext.Current...ServerVariables 才能得到它?
问问题
18374 次
5 回答
30
使用 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;
}
于 2013-11-27T05:56:38.630 回答
5
问题HttpContext.Request.Current.UserHostAddress
在于,HttpContext.Request.Current
如果您是自托管的,那么它是空的。
在当前版本的 SignalR(截至 2012 年 12 月 14 日的“开发”分支)中获取它的方式如下:
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);
}
你曾经能够通过它Context.ServerVariables
:
protected string GetIpAddress()
{
var ipAddress = Context.ServerVariables["REMOTE_ADDR"];
return ipAddress;
}
那要简单得多,但他们出于我不完全理解的原因将其删除。
于 2012-12-05T22:31:15.900 回答
1
根据源码没有,HubCallerContext中没有这个属性。
于 2012-06-15T06:21:05.887 回答
1
另一种方式是
var serverVars = Context.Request.GetHttpContext().Request.ServerVariables;
var Ip = serverVars["REMOTE_ADDR"];
于 2016-03-06T22:45:30.970 回答
0
你试过 HttpContext.Request.UserHostAddress 吗?在此处查看此示例:http: //jameschambers.com/blog/continuous-communication-bridging-the-client-and-server-with-signalr
不要认为这完全是您所希望的,但仍然应该解决问题。
于 2012-06-18T14:30:26.393 回答