【发布时间】:2011-05-19 19:35:30
【问题描述】:
我花了很多时间弄清楚如何配置我的 WCF 服务,以便它们在生产环境中适用于 https。
基本上,我需要这样做:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="HttpsBinding">
<security mode="Transport">
<transport clientCredentialType="None"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
将bindingNamespace 属性添加到端点是使它工作的最后一件事。
但是这个配置在我使用常规 http 的本地开发环境中不起作用。所以我的配置是:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
这里的不同之处在于我将httpsGetEnabled 属性设置为false,并且我删除了bindingConfiguration 和bindingNamespace。
问题是:我如何创建一个可以同时处理两者的配置块?
我真的很讨厌每次发布时都必须对配置进行大量特殊修改。是的,我知道我可以有一个自动更改值的构建后任务,但如果可能的话,我想合并配置。
我尝试过这样的事情:
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
<service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/>
<endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="HttpsBinding">
<security mode="Transport">
<transport clientCredentialType="None"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
我认为同时放置两个端点会在激活服务时为其提供两个选项。但是,这不起作用。我收到此错误:
找不到与具有绑定 BasicHttpBinding 的端点的方案 https 匹配的基地址。注册的基地址方案是 [http]。
环顾 SO 和互联网的其他部分,似乎其他人在杀死这条龙时遇到了问题。
【问题讨论】:
-
您是在 IIS 中托管 WCF 服务,还是自托管??
-
它们在 ASP.NET Web 应用程序中作为 .svc 文件托管。在开发和生产上都使用 IIS7。
-
@sohtimsso1970:你找到解决办法了吗?
-
@Cristi 不,我必须在 dev 和 prod 之间保持不同的配置。在过去的几年里,我几乎在所有地方都离开了 WCF,所以这个问题已经过时了(至少对我来说)。
-
实际上它最终对我有用。问题是我在 IIS 中没有设置 http 绑定(在一些测试中将其删除并忘记了)。
标签: web-config wcf wcf-binding