【发布时间】: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