Utilisation de IDispatchMessageInspector pour obtenir l'adresse distante de la demande

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

Mon objectif est d'obtenir d'une manière ou d'une autre l'adresse distante de la demande entrante, mais pour une raison quelconque, l'adresse n'est visible nulle part dans aucun des paramètres, ou est null.

Voici l'interface que j'implémente:

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

La méthode que j'essaie d'obtenir l'adresse distante est AfterReceiveRequest . J'ai vérifié les deux paramètres request et channel . En outre, il semble que channel.RemoteAddress soit là où il devrait être, mais cette propriété est null pour une raison quelconque. Le paramètre request est également nul, mais j'imagine que c'est parce que je fais un GET et non un POST.

Vous trouverez ci-dessous la signature de la méthode que j'appelle pour tester ceci.

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

3 Réponses

Utilisez OperationContext.Current.IncomingMessageHeaders.From

OU

(OperationContext.Current. IncomingMessageProperties [RemoteEndpointMessageProperty.Name] en tant que RemoteEndpointMessageProperty) .Address

OU

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

5
ajouté
Votre deuxième suggestion a bien fonctionné. Je vous remercie.
ajouté l'auteur rafale, source
Ce n'est pas thread-safe. Voir ma suggestion.
ajouté l'auteur paulius_l, source

Les informations figureront dans les en-têtes de la demande, trouvées à l'aide de:

WebHeaderCollection headers = WebOperationContext.Current.IncomingRequest.Headers;
0
ajouté
J'ai aussi essayé cela à un moment donné, mais les en-têtes ne correspondaient pas à ce que je cherchais. La solution de Yahia semble bien fonctionner.
ajouté l'auteur rafale, source

Utilisez ceci à partir de IDispatchMessageInspector :

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