【问题标题】:How does WCF Decide the Endpoint Addresses used in webHttpBinding with ASP.NET Routing?WCF 如何通过 ASP.NET 路由确定 webHttpBinding 中使用的端点地址?
【发布时间】:2012-10-08 23:13:29
【问题描述】:

我的 Web 应用程序中的一些 Silverlight 代码使用了 WCF 服务。它使用 ASP.NET 路由功能:

private void RegisterRoutes()
{
    var factory = new WebServiceHostFactory();
    RouteTable.Routes.Add(new ServiceRoute("Service", factory, typeof(ServiceService)));
}

这目前在我们的生产环境中有效。

在其他一些环境中,我得到了异常

System.InvalidOperationException:找不到基地址 将端点的方案 http 与绑定 WebHttpBinding 匹配。 注册的基地址方案是 [https]。

我刚刚将完全相同的代码部署到我们的集成环境和培训环境。它在集成中有效,但在训练中失败。两种环境都运行相同版本的 Windows Server 2008 R2 Enterprise,以及相同版本的 IIS 7.5。两者都在 IIS 中配置了相同的绑定(所有 IP 地址上的端口 443 和 80)。

我已经对代码进行了检测,可以看到当它工作时,服务正在使用 http 和 https。失败时,仅使用 https。两个系统之间的 web.config 是相同的。

我知道,通常,对于托管在 IIS 应用程序中的服务,WCF 使用 IIS 中的绑定信息。在这种情况下,正在使用 ASP.NET 路由功能。

WCF 如何确定要使用的基地址?


更新:这是我们的 web.config 文件的摘录:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <diagnostics>
      <endToEndTracing propagateActivity="true" activityTracing="true"
       messageFlowTracing="true" />
    </diagnostics>
    <extensions>
      <behaviorExtensions>
        <add name="silverlightFaults" type="Services.SilverlightFaultBehavior, Services" />
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightRESTBehavior">
          <webHttp helpEnabled="false" automaticFormatSelectionEnabled="false" 
                   defaultOutgoingResponseFormat="Json" faultExceptionEnabled="false" />
          <silverlightFaults />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Services.SpendAnalysisService">
        <endpoint address="" behaviorConfiguration="SilverlightRESTBehavior"
          binding="webHttpBinding" contract="Services.SpendAnalysisService" />
        <host> <!-- Added: not in the original-->
          <baseAddresses>
            <add baseAddress="http://" />
            <add baseAddress="https://" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="d" helpEnabled="false" defaultOutgoingResponseFormat="Json"
          automaticFormatSelectionEnabled="false" faultExceptionEnabled="false" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
</configuration>

编辑

另一个提示:“需要 SSL”在训练环境的 IIS 中设置,在集成环境中被清除。在培训环境中清除它可以防止服务器端异常。现在,两种环境中的 WCF 日志都显示正在考虑 http 和 https 地址。

现在的问题是:为什么当请求以 https 形式到达时,WCF 认为它需要 http?

【问题讨论】:

  • 为 HTTP 和 HTTPS 定义单独的 baseAddresses 看起来不正确,但我找不到任何具体的说这不起作用。您可能希望将您的配置与this SO question & answer 进行比较,以确保配置正确。此外,不同环境之间的 IIS 中的主机标头之间可能存在一些差异(以使 SSL 工作)。在客户端,hosts 文件中的条目可能因客户端环境而异。
  • 单独的基地址是一个实验,将被删除,因为它们没有解决问题。绑定中没有指定主机头。您对主机文件的看法很有趣;你能说这有什么关系吗?使用了主机文件,我觉得它们可能很重要,但不太明白如何。
  • 在客户端,如果集成机器具有与生产类似的主机文件,但训练环境机器不同,那么您可能会看到类似的问题。此外,hosts 文件将包含用于将机器主地址 (127.0.0.1) 替换为 mySecureDomain.org 之类的条目,仍指向 127.0.0.1,因此 SSL 证书中的域仍然有效以启用 HTTPS。
  • 谢谢。仅供参考,https 始终在方案列表中。 “http”存在于集成中,但不存在于训练中。
  • 大提示,但还没有答案:见msdn.microsoft.com/en-us/library/…

标签: .net wcf silverlight webhttpbinding


【解决方案1】:

这个非常具体的问题的答案很简单:

失败的站点具有httphttps 的IIS 绑定。但是,设置了 IIS 中“SSL 设置”下的“需要 SSL”标志。这是有道理的,因为该站点只能通过 SSL 访问(一旦正确设置负载平衡器)。这导致 WCF 从其搜索基地址中排除 http 方案。清除“需要 SSL”标志解决了问题。

一旦我创建了复制器,剩下的问题可能是 Microsoft 支持的问题:为什么 WCF 甚至 思考 关于 http,因为整个请求和所有相关请求都在进来超过https

我希望找到一种方法更通用地重写这个问题,以便答案可以使其他人受益。现在,我很想以“过于本地化”来结束这个问题。

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多