WCF中相当于HttpContext.Current.Request.RawUrl的是什么?

36

我有一些运行在纯WCF上下文中的RESTful服务(即未启用ASP.NET兼容性,因此没有HttpContext.Current对象可用)。

在请求开始时,使用IHttpModule(此时有一个HttpContext并使用HttpContext.Current.RewritePath将其重写)重写服务的URL,以摆脱像URL中的.svc扩展名之类的东西。

然而,我需要从WCF基础架构内部访问原始URL。是否有任何等效于HttpContext.Current.Request.RawUrl的东西在OperationContextWebOperationContext类中?使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri返回的是重写后的URL而不是原始URL。

3个回答

41

您可以通过以下方式获取当前目标的终端节点和Uri:

OperationContext.Current.RequestContext.RequestMessage.Headers.To

我认为这和下面的内容是一样的:

OperationContext.Current.IncomingMessageHeaders.To

这是一个 System.Uri 对象,我认为你可以从中获取想要的部分,例如 OriginalString 或者 PathAndQuery


2

尝试类似这样的内容:

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri

根据问题标题来看,这是一个很好的答案(从谷歌搜索的角度来说)。 - Sami
我尝试了System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri、OperationContext.Current.RequestContext.RequestMessage.Headers.To和OperationContext.Current.IncomingMessageHeaders.To,唯一有效的是OperationContext.Current.Channel.LocalAddress.Uri。 - rob

1
我发现使用
OperationContext.Current.RequestContext.RequestMessage.Headers.To

这个程序大部分时间都可以正常工作,但对于我的应用来说却不行。它位于一个网络负载均衡器(NLB)后面,这导致它丢失了原始输入主机名。但是,输入主机仍然在一个名为“Host”的标头中,这个标头非常难以获取。它位于:

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

System.ServiceModel.OperationContext.Current.IncomingMessageHeaders中的标头对象并没有真正包含来自客户端的所有标头。


好的观点。还要注意UserHostAddress的问题:https://dev59.com/XUbRa4cB1Zd3GeqP4uVc - styfle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接