Подтвердить что ты не робот

Что такое эквивалент 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, а не оригинальный.

4b9b3361

Ответ 1

Вы можете получить конечную точку в настоящее время и Uri для нее:

OperationContext.Current.RequestContext.RequestMessage.Headers.To

который, как я думаю, является тем же:

OperationContext.Current.IncomingMessageHeaders.To

Это объект System.Uri, и я считаю, что вы можете просто получить OriginalString или PathAndQuery или любые части, которые вы хотите от него.

Ответ 2

попробуйте что-то вроде этого:

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri

Ответ 3

Я обнаружил, что используя

OperationContext.Current.RequestContext.RequestMessage.Headers.To

работает большую часть времени, но не для моего приложения. Он находится за NLB (Network Load Balancer), который заставляет его потерять исходное имя входного хоста. Но входной хост все еще находится в заголовке с именем "Хост", что было удивительно сложно. Он расположен по адресу:

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

(объекты заголовка в System.ServiceModel.OperationContext.Current.IncomingMessageHeaders действительно не имеют всех заголовков клиента)