IDispatchMessageInspector gebruiken om het externe adres van het verzoek op te halen

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

Mijn doel is om op de een of andere manier het externe adres van de inkomende aanvraag te krijgen, maar om een ​​of andere reden is het adres nergens te zien in een van de parameters, of is het null.

Dit is de interface die ik implementeer:

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

De methode die ik probeer om het externe adres op te halen is AfterReceiveRequest . Ik heb beide parameters verzoek en kanaal gecontroleerd. Ook lijkt het erop dat channel.RemoteAddress is waar het zou moeten zijn, maar die eigenschap is om welke reden dan ook null. De parameter request is ook null, maar ik vermoed dat dat komt omdat ik een GET doe en geen POST.

Hieronder staat de handtekening van de methode die ik aanroep om dit uit te testen.

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

3 antwoord

Gebruik OperationContext.Current.IncomingMessageHeaders.From

OF

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

OF

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

5
toegevoegd
Uw tweede suggestie werkte prima. Dank je.
toegevoegd de auteur rafale, de bron
Dit is niet thread-veilig. Zie mijn suggestie.
toegevoegd de auteur paulius_l, de bron

De informatie bevindt zich in de headers van de verzoeken, gevonden met:

WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
0
toegevoegd
Ik heb dat ook op een gegeven moment geprobeerd, maar de headers hadden niet wat ik zocht. De oplossing van Yahia lijkt goed te werken.
toegevoegd de auteur rafale, de bron

Gebruik dit vanuit de implementatie van IDispatchMessageInspector :

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