Verwenden von IDispatchMessageInspector zum Abrufen der Remoteadresse der Anfrage

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

Mein Ziel ist es, irgendwie die entfernte Adresse der eingehenden Anfrage zu bekommen, aber aus irgendeinem Grund ist die Adresse entweder nirgendwo in irgendeinem der Parameter zu sehen oder ist null.

Hier ist die Schnittstelle, die ich implementiere:

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

Die Methode, die ich versuche, die Remote-Adresse zu erhalten, ist AfterReceiveRequest . Ich habe beide Parameter request und channel überprüft. Es scheint auch, dass channel.RemoteAddress dort ist, wo es sein sollte, aber diese Eigenschaft ist aus irgendeinem Grund null. Der request -Parameter ist ebenfalls null, aber ich vermute, weil ich ein GET und kein POST mache.

Unten ist die Signatur der Methode, die ich anrufe, um dies zu testen.

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

3 Antworten

Verwenden Sie OperationContext.Current.IncomingMessageHeaders.From

ODER

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

ODER

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

5
hinzugefügt
Ihr zweiter Vorschlag hat gut funktioniert. Vielen Dank.
hinzugefügt der Autor rafale, Quelle
Dies ist nicht Thread-sicher. Siehe meinen Vorschlag.
hinzugefügt der Autor paulius_l, Quelle

Die Informationen werden in den Anforderungsheadern enthalten sein.

WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
0
hinzugefügt
Das habe ich auch irgendwann versucht, aber die Header hatten nicht das, wonach ich gesucht habe. Yahios Lösung scheint gut zu funktionieren.
hinzugefügt der Autor rafale, Quelle

Verwenden Sie diese Implementierung von IDispatchMessageInspector :

var remoteEndpoint = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
var ipAddress = remoteEndpoint.Address;
0
hinzugefügt