Что такое эквивалент 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, а не оригинальный.
Ответы
Ответ 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 действительно не имеют всех заголовков клиента)