Что такое 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 действительно не имели всех заголовков от клиента)

Другие вопросы по тегам