【发布时间】:2010-12-01 07:08:31
【问题描述】:
我有一组服务合同,它们将我的服务接口分成相关功能块。我目前正在使用单个服务类实现所有合同(可能希望稍后拆分这些合同,但现在单个服务类就足够了)。
我正在尝试使用配置文件(而不是通过代码)来配置端点。问题是我得到了一个ServiceActivationException,因为两个端点(每个服务合同一个)试图监听同一个uri。异常细节说,要实现这一点,两个端点必须共享绑定对象,这是有道理的,但我不知道如何通过配置来做到这一点(我没有尝试通过代码来做到这一点,因为我在 IIS 中托管但是我可以想象这是一个在代码中配置的简单练习。
以下是我当前使用的配置(这仍然是开发,所以我目前不担心其中一些设置可能会暴露的安全问题等):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="CDC.WebPortal.MidTier.MidTierAccessService"
behaviorConfiguration="MidTierServiceBehaviour" >
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.IProductService" />
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.ICategoryService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="RestBindingConfiguration"
maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="104857600"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MidTierServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
所以我的问题是如何在两个端点之间共享这个绑定?
this SO question 中的评论表明我可能无法做到这一点,但我不相信这是正确的。
更新 1 根据this MS publication 我正在做的应该没问题...
UPDATE2如果有帮助,这里是 svc 文件内容:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
更新 3 以下是异常详情:
绑定实例已关联到侦听 URI '********************'。如果 两个端点想要共享同一个 ListenUri,它们也必须共享同一个绑定 对象实例。两个冲突的端点要么在 AddServiceEndpoint() 调用,在配置文件中,或 AddServiceEndpoint() 的组合 和配置。
更新 4 好的,我之前错过了 this,指出“在为特定 .svc 服务公开多个端点时,您将需要使用相对地址”。造成这种情况的原因与确定服务基地址的 IIS 虚拟目录有关,任何人都可以更详细地解释一下,即为什么 IIS 需要对每个合同进行相对寻址。
【问题讨论】:
标签: wcf iis configuration iis-7 wcf-binding