我的 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?