使用IDispatchMessageInspector获取请求的远程地址

I'm trying to follow this blog post: http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

我的目的是以某种方式获取传入请求的远程地址,但由于某种原因,地址要么在任何参数中都无法看到,要么为空。

这是我正在实现的界面:

public interface IDispatchMessageInspector
{
    object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext);
    void BeforeSendReply(ref Message reply, object correlationState);
}

我试图获取远程地址的方法是 AfterReceiveRequest 。我检查了两个参数 requestchannel 。此外,似乎 channel.RemoteAddress 应该是它的位置,但由于某种原因该属性为null。 request 参数也是null,但我猜是因为我正在进行GET而不是POST。

下面是我正在调用以测试它的方法的签名。

[OperationContract, WebGet( UriTemplate = "{*path}", ResponseFormat = WebMessageFormat.Json)]
string[] GetList(string path);
2

3 答案

使用 OperationContext.Current.IncomingMessageHeaders.From

要么

(OperationContext.Current.IncomingMessageProperties [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty).Address

要么

HttpContext.Current.Request.UserHostAddress (BEWARE this one requires setting )

5
额外
你的第二个建议很好。谢谢。
额外 作者 rafale,
这不是线程安全的。看看我的建议。
额外 作者 paulius_l,

该信息将位于请求标头中,使用以下命令找到:

WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
0
额外
我在某些时候也尝试过,但标题没有我想要的东西。 Yahia的解决方案似乎运作良好。
额外 作者 rafale,

IDispatchMessageInspector 实现中使用它:

var remoteEndpoint = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var ipAddress = remoteEndpoint.Address;
0
额外