我有一组服务合同,它将我的服务接口分成相关功能块。我目前正在使用单个服务类实现所有合约(稍后可能需要拆分这些合约,但目前单个服务类就足够了)。
我正在尝试使用配置文件(而不是通过代码)配置端点。问题是我得到了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>
所以我的问题是如何在两个端点之间共享此绑定?
评论于这个问题 https://stackoverflow.com/questions/1182725/multiple-endpoints-under-iis建议我可能无法做到这一点,但我不认为这是正确的。
UPDATE 1根据本 MS 出版物 http://msdn.microsoft.com/en-us/magazine/cc163412.aspx#S4我正在做的事情应该没问题...
UPDATE2这是 svc 文件内容(如果有帮助的话):
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
UPDATE 3这是异常详细信息:
绑定实例已关联到侦听 URI '********************'。如果
两个端点想要共享相同的 ListenUri,它们也必须共享相同的绑定
对象实例。两个冲突的端点要么在
配置文件中的 AddServiceEndpoint() 调用,或 AddServiceEndpoint() 的组合
和配置。
UPDATE 4好吧,我错过了this http://msdn.microsoft.com/en-us/magazine/cc163412.aspx#S3之前,声明“在为特定 .svc 服务公开多个端点时,您将需要使用相对地址”。造成这种情况的原因与 IIS 虚拟目录确定服务的基地址有关,任何人都可以更详细地解释这一点,即为什么 IIS 需要每个合同的相对寻址。