我想处理每个信号器连接到我的集线器的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套接字用于底层连接,则会发生大多数故障。
答案 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服务器(或者可能是自托管服务器),它还有更好的机会继续工作。