0

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

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

这目前适用于我们的生产环境。

在其他一些环境中,我得到了例外

System.InvalidOperationException:找不到与具有绑定 WebHttpBinding 的端点的方案 http 匹配的基地址。注册的基地址方案是 [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>

编辑

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

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

4

1 回答 1

0

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

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

一旦我创建了一个复制器,剩下的问题可能是微软支持的一个问题:为什么在整个请求和所有相关请求都进来之后, WCF 还要考虑这个问题?httphttps

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

于 2012-10-11T00:45:53.130 回答