WCF如何使用ASP.NET路由确定webHttpBinding中使用的端点地址?

时间:2012-10-08 23:13:29

标签: .net wcf silverlight webhttpbinding

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

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

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

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

  

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

我刚刚在Integration环境和Training环境中部署了完全相同的代码。它适用于集成,但在培训中失败。这两个环境都运行相同版本的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>

修改

另一个提示:&#34; SSL要求&#34;在Training环境中的IIS中设置,并在Integration环境中清除。在Training环境中清除它可以防止服务器端异常。现在,两个环境中的WCF日志都显示正在考虑http和https地址。

现在的问题是:为什么WCF认为在请求到达时需要http为https?

1 个答案:

答案 0 :(得分:0)

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

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

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

我希望找到一种更普遍地重写这个问题的方法,这样答案可以使其他人受益。现在,我很想把这个问题称为“太本地化”。