Quel est l'équivalent WCF de HttpContext.Current.Request.RawUrl?
-
22-07-2019 - |
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.
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.