Что такое WCF-эквивалент HttpContext.Current.Request.RawUrl?
-
22-07-2019 - |
Вопрос
У меня есть некоторые службы RESTful, работающие в чистом контексте WCF (т.е. совместимость с ASP.NET не включена, и, следовательно, нет доступного объекта HttpContext.Current
).
URL-адреса служб перезаписываются в начале запроса с использованием IHttpModule
(который в этот момент имеет HttpContext
и переписывает его с использованием HttpContext .Current.RewritePath
), чтобы избавиться от таких вещей, как расширение .svc
из URL.
Однако мне нужно получить доступ к исходному URL-адресу, который был запрошен из инфраструктуры WCF. Есть ли где-нибудь эквивалент HttpContext.Current.Request.RawUrl
в классах OperationContext
или WebOperationContext
? Использование WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri
возвращает переписанный URL, а не исходный.
Решение
Вы можете получить конечную точку в настоящее время и Uri для нее, выполнив:
OperationContext.Current.RequestContext.RequestMessage.Headers.To
я думаю, что это то же самое, что и
OperationContext.Current.IncomingMessageHeaders.To
Это объект System.Uri
, и я считаю, что вы можете просто получить OriginalString
или PathAndQuery
или любые другие части, которые вы хотите получить он.
Другие советы
попробуйте что-то вроде этого:
OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri
Я обнаружил, что с помощью
OperationContext.Current.RequestContext.RequestMessage.Headers.To
работает большую часть времени, но не для моего приложения. Он находится за NLB (Network Load Balancer), что приводит к потере исходного имени хоста ввода. Но входной хост все еще находится в заголовке с именем "Host", к которому было удивительно сложно добраться. Он расположен по адресу:
System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.Headers["Host"]
(объекты заголовка в System.ServiceModel.OperationContext.Current.IncomingMessageHeaders действительно не имеют всех заголовков от клиента)