Что такое WCF-эквивалент HttpContext.Current.Request.RawUrl?
У меня есть некоторые службы 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, а не исходный.
3 ответа
Вы можете получить конечную точку в настоящее время и 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 действительно не имели всех заголовков от клиента)