【问题标题】:What is the WCF equivalent of HttpContext.Current.Request.RawUrl?什么是 HttpContext.Current.Request.RawUrl 的 WCF 等效项?
【发布时间】:2010-10-01 10:27:39
【问题描述】:

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

服务的 URL 在请求开始时使用 IHttpModule 重写(此时确实有 HttpContext 并使用 HttpContext.Current.RewritePath 重写它)以摆脱像 .svc 这样的东西URL 的扩展名。

但是,我需要访问从 WCF 基础结构中请求的原始 URL。在任何地方的OperationContextWebOperationContext 类上是否有等效于HttpContext.Current.Request.RawUrl 的内容?使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri 会返回重写后的 URL,而不是原始 URL。

【问题讨论】:

    标签: wcf url-rewriting httpcontext operationcontext weboperationcontext


    【解决方案1】:

    您可以通过以下方式获取当前目标端点及其 Uri:

    OperationContext.Current.RequestContext.RequestMessage.Headers.To
    

    我认为与以下内容相同:

    OperationContext.Current.IncomingMessageHeaders.To
    

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

    【讨论】:

      【解决方案2】:

      试试这样的:

      OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri
      

      【讨论】:

      • 根据问题标题的好答案(用谷歌搜索角度说)
      • 我试过 System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri、OperationContext.Current.RequestContext.RequestMessage.Headers.To 和 OperationContext.Current.IncomingMessageHeaders.To,只有一个有效的是 OperationContext.Current.Channel.LocalAddress.Uri
      【解决方案3】:

      我发现使用

      OperationContext.Current.RequestContext.RequestMessage.Headers.To
      

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 2018-11-12
      • 2012-10-16
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多