Question

Certains services RESTful s'exécutent dans un contexte WCF pur (la compatibilité ASP.NET n'est pas activée et aucun objet HttpContext.Current n'est disponible).

Les URL des services sont réécrites au début de la demande en utilisant un IHttpModule (qui à ce stade a un HttpContext et le réécrit en utilisant HttpContext .Current.RewritePath ) pour se débarrasser d'éléments tels que l'extension .svc de l'URL.

Cependant, je dois accéder à l'URL d'origine demandée dans l'infrastructure WCF. Existe-t-il un équivalent de HttpContext.Current.Request.RawUrl sur les classes OperationContext ou WebOperationContext n'importe où? L'utilisation de WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri renvoie l'URL réécrite, et non l'original.

Était-ce utile?

La solution

Vous pouvez obtenir le point final actuellement ciblé et son Uri en procédant comme suit:

OperationContext.Current.RequestContext.RequestMessage.Headers.To

ce que je pense est la même chose que:

OperationContext.Current.IncomingMessageHeaders.To

Il s'agit d'un objet System.Uri et je pense que vous pouvez obtenir le OriginalString ou le PathAndQuery , ou tout autre élément de votre choix. il.

Autres conseils

essayez quelque chose comme ça:

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri

J'ai constaté que l'utilisation de

OperationContext.Current.RequestContext.RequestMessage.Headers.To

fonctionne la plupart du temps, mais pas pour mon application. Il se trouve derrière un NLB (Network Load Balancer), qui lui fait perdre le nom d'hôte d'entrée d'origine. Mais l'hôte en entrée se trouve toujours dans un en-tête nommé "Host", ce qui était étonnamment difficile à obtenir. Il est situé à:

System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.Headers["Host"]

(les objets d'en-tête de System.ServiceModel.OperationContext.Current.IncomingMessageHeaders ne comportaient pas vraiment tous les en-têtes du client.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top