SignalR获取来电者IP地址

时间:2012-06-15 03:54:04

标签: asp.net-mvc signalr

是否可以通过HubCallerContext获取呼叫者的IP地址?或者我是否必须通过HttpContext.Current ... ServerVariables来获取它?

5 个答案:

答案 0 :(得分:28)

使用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;
    }

答案 1 :(得分:5)

HttpContext.Request.Current.UserHostAddress的问题是如果您是自托管的,HttpContext.Request.Current为空。

你在当前版本的SignalR中获得它的方式(截至12/14/2012的'dev'分支)是这样的:

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;
}

这样做要简单得多,但是由于我不完全理解的原因,他们删除了它。

答案 2 :(得分:1)

其他方式是

var serverVars = Context.Request.GetHttpContext().Request.ServerVariables;
var Ip = serverVars["REMOTE_ADDR"];

答案 3 :(得分:0)

根据source code no,HubCallerContext中没有这样的属性。

答案 4 :(得分:0)

您是否尝试过HttpContext.Request.UserHostAddress?请在此处查看此示例http://jameschambers.com/blog/continuous-communication-bridging-the-client-and-server-with-signalr

不要认为它相当你所希望的但是应该解决问题。