Вопрос

У меня есть некоторые службы 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, а не исходный.

Это было полезно?

Решение

Вы можете получить конечную точку в настоящее время и 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 действительно не имеют всех заголовков от клиента)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top