在负载平衡情况下使用 WCF 4.5 RemoteEndpointMessageProperty 获取客户端 IP 地址
Get Client IP address using WCF 4.5 RemoteEndpointMessageProperty in load balancing situation
我在 IIS 中托管了 WCF 4.5 Restful 服务,我正在尝试使用
RemoteEndpointMessageProperty 获取客户端的 IP 地址
使用服务。
代码 1:
private string GetClientIP()
{
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
return ip;
}
代码 2:
private string GetClientIP()
{
string retIp = string.Empty;
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
HttpRequestMessageProperty endpointLoadBalancer =
prop[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
if (endpointLoadBalancer.Headers["X-Forwarded-For"] != null)
{
retIp = endpointLoadBalancer.Headers["X-Forwarded-For"];
}
if (string.IsNullOrEmpty(retIp))
{
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
retIp = endpoint.Address;
}
return retIp;
}
但是,由于 WCF 服务托管在负载平衡器后面的 IIS 中,因此
我得到的 IP 地址始终是负载均衡器的 IP。
有什么办法可以解决这个问题,这样我就可以获得真实的 IP
客户?
OperationContext context = OperationContext.Current;
MessageProperties properties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string address = string.Empty;
//http://www.simosh.com/article/ddbggghj-get-client-ip-address-using-wcf-4-5-remoteendpointmessageproperty-in-load-balanc.html
if (properties.Keys.Contains(HttpRequestMessageProperty.Name))
{
HttpRequestMessageProperty endpointLoadBalancer = properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
if (endpointLoadBalancer != null && endpointLoadBalancer.Headers["X-Forwarded-For"] != null)
address = endpointLoadBalancer.Headers["X-Forwarded-For"];
}
if (string.IsNullOrEmpty(address))
{
address = endpoint.Address;
}
这适用于负载均衡器,也适用于没有负载均衡器的情况。我有一个端点作为 TCP,另一个端点作为 REST API.
的 Web http
最重要的是,如果您正在使用
async await
OperationContext.Current; will be null
我的用法是获取 Ip,所以在任何可等待的调用之前就这样使用它
var clientIpAddress = System.Web.HttpContext.Current?.Request?.UserHostAddress;
在您的异步服务操作中的第一个 await 语句之后,OperationContext.Current 可能为空,因为方法主体的其余部分可能 运行 在不同的线程上(并且 OperationContext 不会在线程之间流动
因此,要获得它,您可以在任何可等待的操作之前编写代码
可能会对某人有所帮助 :)
我在 IIS 中托管了 WCF 4.5 Restful 服务,我正在尝试使用 RemoteEndpointMessageProperty 获取客户端的 IP 地址 使用服务。
代码 1:
private string GetClientIP()
{
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
return ip;
}
代码 2:
private string GetClientIP()
{
string retIp = string.Empty;
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
HttpRequestMessageProperty endpointLoadBalancer =
prop[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
if (endpointLoadBalancer.Headers["X-Forwarded-For"] != null)
{
retIp = endpointLoadBalancer.Headers["X-Forwarded-For"];
}
if (string.IsNullOrEmpty(retIp))
{
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
retIp = endpoint.Address;
}
return retIp;
}
但是,由于 WCF 服务托管在负载平衡器后面的 IIS 中,因此 我得到的 IP 地址始终是负载均衡器的 IP。 有什么办法可以解决这个问题,这样我就可以获得真实的 IP 客户?
OperationContext context = OperationContext.Current;
MessageProperties properties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string address = string.Empty;
//http://www.simosh.com/article/ddbggghj-get-client-ip-address-using-wcf-4-5-remoteendpointmessageproperty-in-load-balanc.html
if (properties.Keys.Contains(HttpRequestMessageProperty.Name))
{
HttpRequestMessageProperty endpointLoadBalancer = properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
if (endpointLoadBalancer != null && endpointLoadBalancer.Headers["X-Forwarded-For"] != null)
address = endpointLoadBalancer.Headers["X-Forwarded-For"];
}
if (string.IsNullOrEmpty(address))
{
address = endpoint.Address;
}
这适用于负载均衡器,也适用于没有负载均衡器的情况。我有一个端点作为 TCP,另一个端点作为 REST API.
的 Web http最重要的是,如果您正在使用
async await
OperationContext.Current; will be null
我的用法是获取 Ip,所以在任何可等待的调用之前就这样使用它
var clientIpAddress = System.Web.HttpContext.Current?.Request?.UserHostAddress;
在您的异步服务操作中的第一个 await 语句之后,OperationContext.Current 可能为空,因为方法主体的其余部分可能 运行 在不同的线程上(并且 OperationContext 不会在线程之间流动
因此,要获得它,您可以在任何可等待的操作之前编写代码
可能会对某人有所帮助 :)