我有一个环境,在同一服务器上托管的多个站点将使用单个服务进行调用。例如:
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个域上工作的任何想法?
答案 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)