什么是HttpContext.Current.Request.RawUrl的WCF等价物?

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

服务的URL在请求开始时使用一个IHttpModule (在那个时候有一个HttpContext并且使用HttpContext.Current.RewritePath重写它)来重写,以去掉URL中的.svc扩展名。

但是,我需要访问WCF基础结构内请求的原始URL。 在OperationContextWebOperationContext类的任何地方有没有相当于HttpContext.Current.Request.RawUrl ? 使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri返回重写的URL不是原来的。

您可以通过执行以下操作来获取目标terminal和Uri:

 OperationContext.Current.RequestContext.RequestMessage.Headers.To 

我认为这是一样的事情:

 OperationContext.Current.IncomingMessageHeaders.To 

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

尝试这样的事情:

 OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri 

我发现使用

 OperationContext.Current.RequestContext.RequestMessage.Headers.To 

大部分时间都可以使用,但是不适合我的应用程序。 它位于NLB(networking负载平衡器)后面,导致它丢失原始input主机名。 input主机仍然在名为“主机”的标题,这是令人惊讶的难以接近。 它位于:

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

System.ServiceModel.OperationContext.Current.IncomingMessageHeaders中的头对象并不真正拥有客户端的所有头文件)