-
-
Save MikeJansen/2653453 to your computer and use it in GitHub Desktop.
| // Original idea: http://stackoverflow.com/questions/9565889/get-the-ip-address-of-the-remote-host | |
| using System.Net.Http; | |
| using System.ServiceModel.Channels; | |
| using System.Web; | |
| namespace CrowSoftware.Api | |
| { | |
| public static class HttpRequestMessageHelper | |
| { | |
| public static string GetClientIpAddress(this HttpRequestMessage request) | |
| { | |
| if (request.Properties.ContainsKey("MS_HttpContext")) | |
| { | |
| return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress; | |
| } | |
| else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) | |
| { | |
| RemoteEndpointMessageProperty prop; | |
| prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]; | |
| return prop.Address; | |
| } | |
| else | |
| { | |
| return null; | |
| } | |
| } | |
| } | |
| } |
I'd add one more change:
Instead of Casting to HttpContextWrapper which is not easy to Mock cast to HttpContextBase:
public static string GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
return ((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
return ((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address;
return "IP Address Unavailable"; //here the user can return whatever they like
}
Another change which may be considered useful is to return type IPAddress instead of string.
public static IPAddress GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return IPAddress.Parse(((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress);
}
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
return IPAddress.Parse(((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address);
}
throw new Exception("Client IP Address Not Found in HttpRequest");
}
Another change with support for OWIN
public static IPAddress GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return IPAddress.Parse(((HttpContextBase)request.Properties["MS_HttpContext"]).Request.UserHostAddress);
}
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
return IPAddress.Parse(((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address);
}
if (request.Properties.ContainsKey("MS_OwinContext"))
{
return IPAddress.Parse(((OwinContext)request.Properties["MS_OwinContext"]).Request.RemoteIpAddress);
}
throw new Exception("Client IP Address Not Found in HttpRequest");
}
UserHostName '((((HttpContextBase)request.Properties["MS_HttpContext"])).Request).UserHostName' threw an exception of type 'System.ArgumentException' string {System.ArgumentException}
UserHostName '((((HttpContextBase)request.Properties["MS_HttpContext"])).Request).UserHostName' threw an exception of type 'System.ArgumentException' string {System.ArgumentException}
I'm having same problem with Argument exception. It happens when I wrap the code in Task.Run(... )
Very nice, but it could be a little cleaner: