12

是否可以通过 HubCallerContext 获取调用者的 IP 地址?还是我必须通过 HttpContext.Current...ServerVariables 才能得到它?

4

5 回答 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 回答