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

时间:2009-01-14 17:53:09

标签: wcf url-rewriting httpcontext operationcontext weboperationcontext

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

服务的URL在请求开始时使用IHttpModule(在此时具有HttpContext并使用HttpContext.Current.RewritePath重写它)来重写以删除例如来自网址的.svc扩展名。

但是,我需要访问WCF基础结构中请求的原始URL。在任何地方HttpContext.Current.Request.RawUrlOperationContext类都有WebOperationContext的等价物吗?使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri返回重写的URL而不是原始URL。

3 个答案:

答案 0 :(得分:40)

您可以通过执行以下操作获取当前定位的端点和Uri:

OperationContext.Current.RequestContext.RequestMessage.Headers.To

我认为与以下内容相同:

OperationContext.Current.IncomingMessageHeaders.To

这是一个System.Uri对象,我相信您可以获得OriginalStringPathAndQuery,或者您想要的任何部分。

答案 1 :(得分:2)

尝试这样的事情:

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri

答案 2 :(得分:1)

我发现使用

OperationContext.Current.RequestContext.RequestMessage.Headers.To

大部分当时工作,但不适用于我的应用程序。它位于NLB(网络负载均衡器)之后,导致它丢失原始输入主机名。 但是输入主机仍然在一个名为“Host”的标题中,这令人惊讶地难以理解。它位于:

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

System.ServiceModel.OperationContext.Current.IncomingMessageHeaders 中的标题对象并没有真正拥有客户端的所有标题)