Что такое WCF-эквивалент HttpContext.Текущий.Запрос.RawUrl?


У меня есть несколько служб RESTful, работающих в чистом контексте WCF (т. е. ASP.NET совместимость не включена, и, следовательно, Объект HttpContext.Current недоступен).

Url-адреса служб переписываются в начале запроса с помощью IHttpModule (который в этот момент имеет HttpContext и переписывает его с помощью HttpContext.Current.RewritePath), Чтобы избавиться от таких вещей, как расширение .svc из URL.

Однако мне нужно получить доступ к исходному URL-адресу, который был запрошен из инфраструктуры WCF. Является есть ли где-нибудь эквивалент HttpContext.Current.Request.RawUrl на классах OperationContext или WebOperationContext? Using WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri возвращает переписанный URL, а не исходный.
3 34

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), что приводит к потере исходного имени узла ввода. но входной хост по-прежнему находится в заголовке с именем "хост", до которого было удивительно трудно добраться. Он расположен по адресу:

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

(заголовочные объекты в системе .Модель обслуживания.OperationContext.Текущий.IncomingMessageHeaders на самом деле не все заголовки из клиент)