在自托管SignalR集线器中获取客户端IP地址

Ken*_*ith 5 signalr

您如何在自托管SignalR集线器中获取远程客户端的IP地址?根据这个问题,您可以在某一时刻使用Context.ServerVariables []来获取它,但最近版本的SignalR似乎缺少这一点.

Ken*_*ith 5

好吧,在最近对SignalR项目(特别是这个)的提交中,我发现了如何做到这一点.

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);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我没有尝试使用自托管的SignalR Hub,但是使用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;
}
Run Code Online (Sandbox Code Playgroud)

  • 另一种作为单行的形式是`Context.Request.Environment ["server.RemoteIpAddress"].ToString();` (3认同)