单个WCF服务中的多个基址

时间:2009-02-03 21:04:28

标签: .net wcf

我有一个环境,在同一服务器上托管的多个站点将使用单个服务进行调用。例如:

http://domain1.com/Api/Service.svc

http://domain2.com/Api/Service.svc

Api应用程序已设置为映射到同一物理目录的每个站点中的虚拟目录,因此源仅位于一个位置。问题是WCF不喜欢为其服务端点提供多个基地址。为了让服务工作,我不得不添加一个基地址前缀过滤器:

<serviceHostingEnvironment>      
  <baseAddressPrefixFilters>        
    <add prefix="http://domain1.com/Api" />
    <!--<add prefix="http://domain2.com/Api" />-->
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

但是这仅适用于domain1,因为您只允许一个baseAddressPrefixFilter(如果您只允许一个,则不应将其称为baseAddressPrefixFilter s )。我尝试构建一个自定义的ServiceHostFactory来绕过它,但是在激活过程中调用ServiceHostFactory之前我遇到了过滤器问题。

关于如何让单个服务在这样的2个域上工作的任何想法?

2 个答案:

答案 0 :(得分:6)

好的,将整个URL放在端点地址中是我没想过的,所以这就是让我到处找个地方。使用自定义ServiceHostFactory后,适用于domain1,但不适用于domain2。我收到了一条我以前没见过的新错误消息:

“没有协议绑定与给定地址”http://domain2.com/Api/Poll.svc/soap匹配。协议绑定在IIS或WAS配置中的站点级别配置。“

<强>更新

好的,我想通了(最后!)。我可以将主机节点添加到服务定义中,并避免在每个端点中使用绝对URL。我还删除了BaseAddressPrefixFilter,但在解决方案中保留了自定义ServiceHostFactory。

  <service name="Poll">
    <host>
      <baseAddresses>
        <add baseAddress="http://domain1.com/Api"/>
        <add baseAddress="http://domain2.com/Api"/>
      </baseAddresses>
    </host>
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding"
      contract="IPoll" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />        
  </service>

我担心我将不得不为每个绑定编写一个端点,这可能需要管理很多额外的配置。这个解决方案很棒,因为我不必这样做,它更简洁一点。

供参考,这是我的ServiceHostFactory类。它很简单,但它是必需的。一旦你有了这个,你还必须修改你的.svc文件的标记,以包括Factory:Factory =“Api.ServiceHostFactory”

   public class MyServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {                        
        ServiceHost host;

        host = new ServiceHost(serviceType, baseAddresses[0]);

        return host;
    }
}

答案 1 :(得分:1)

IIRC,你可以有不同的前缀 - 但每个协议只有一个 - 所以你可以有一个tcp前缀,也许是一个https前缀(需要检查那个)。但是,您还应该能够提供服务的完整地址,而不是使用基地址和相对部分?但是,您可能需要多个端点。