使用 wsDualHttpBinding 在 WCF 中获取客户端 IP 地址



我在服务中使用以下代码

public class HeartBeat : IHeartBeat
{
public string GetData()
{
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
return "IP address is: " + ip;
}
}

我注意到,如果我的 Web 配置是:

<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>  

我可以成功获取 IP 地址。但是,如果我像这样使用双 http 绑定:

<protocolMapping>
<add binding="wsDualHttpBinding" scheme="http" />
</protocolMapping>    

我得到一个空返回。有没有其他方法可以在wsDualHttpBinding中获取客户端的IP地址?提前谢谢你

发生这种情况是因为RemoteEndpointMessageProperty.Address属性在wsDualHttpBinding的情况下显示为空。

RemoteEndpointMessageProperty使用HttpApplication.Request.UserHostAddress返回 IP。 但是,HttpContextWSDualHttpBinding中不可用,从而导致"请求在上下文中不可用"异常。

您可以尝试访问双通道的主机属性,如下所示。

if (string.IsNullOrEmpty(endpoint.Address))
{
string clientIpOrName = System.ServiceModel.OperationContext.Current.Channel.RemoteAddress.Uri.Host;
}

终于用@Neel想通

public class HeartBeat : IHeartBeat
{
public string GetData()
{
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
EndpointAddress test = OperationContext.Current.Channel.RemoteAddress;
IPHostEntry ipHostEntry = Dns.GetHostEntry(System.ServiceModel.OperationContext.Current.Channel.RemoteAddress.Uri.Host);
foreach (IPAddress ip2 in ipHostEntry.AddressList)
{
if (ip2.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
//System.Diagnostics.Debug.WriteLine("LocalIPadress: " + ip);
return ip2.ToString();
}
}
return "IP address is: " +  System.ServiceModel.OperationContext.Current.Channel.RemoteAddress.Uri.Host;
}
}

最新更新