获取连接的IP地址

时间:2013-11-19 20:34:25

标签: asp.net-mvc-4 signalr signalr-hub

我想处理每个信号器连接到我的集线器的IP地址和用户代理。为此,我重写了OnConnected方法,如下所示。

        public override Task OnConnected()
        {
            string UserAgent = Context.Headers["User-Agent"];

            var Request = Context.Request.GetHttpContext().Request;
            string IPAddress = Request.UserHostAddress;

            // code to process IP address and user agent goes here

            return base.OnConnected();
        }

是否有更强大的方法来检索IP地址?对Context.Request.GetHttpContext()的调用。请求有时会失败。使用fiddler,我可以看到,如果将Web套接字用于底层连接,则会发生大多数故障。

1 个答案:

答案 0 :(得分:3)

我建议直接从OWIN的环境词典中提取IP地址:

Request.GetHttpContext()实际上是通过从环境字典中获取HttpContextBase来实现的:

/// <summary>
/// Returns the <see cref="HttpContextBase"/> for this <see cref="IRequest"/>.
/// </summary>
/// <param name="request">The request</param>
public static HttpContextBase GetHttpContext(this IRequest request)
{
    object httpContextBaseValue;
    if (request.Environment.TryGetValue(typeof(HttpContextBase).FullName, out httpContextBaseValue))
    {
        return httpContextBaseValue as HttpContextBase;
    }

    return null;
}

您可以专门为获取IP地址编写类似内容:

public static string GetRemoteIpAddress(this IRequest request)
{
    object ipAddress;
    if (request.Environment.TryGetValue("server.RemoteIpAddress", out ipAddress))
    {
        return ipAddress as string;
    }
    return null;
}

这不仅可能更强大,而且如果将应用程序移植到另一个Web服务器(或者可能是自托管服务器),它还有更好的机会继续工作。