我的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?
答案 0 :(得分:0)
这个非常具体的问题的答案很简单:
失败的网站对http
和https
都有IIS绑定。但是,已设置IIS中“SSL设置”下的“要求SSL”标志。这是有道理的,因为该站点仅用于通过SSL访问(一旦负载均衡器设置正确)。这导致WCF从搜索基地址中排除http方案。清除“需要SSL”标志解决了问题。
一旦我创建了一个复制器,剩下的问题可能是微软支持的一个问题:为什么世界上的WCF甚至思考关于http
,因为整个请求和所有相关请求都是进入https
?
我希望找到一种更普遍地重写这个问题的方法,这样答案可以使其他人受益。现在,我很想把这个问题称为“太本地化”。