我有一个环境,同一服务器上托管的多个站点将使用单个服务进行调用。例如:
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(他们不应该称它为baseAddressPrefixFilters如果你只被允许一个)。我尝试构建一个自定义 ServiceHostFactory 来解决这个问题,但在激活过程中调用 ServiceHostFactory 之前我遇到了过滤器问题。
关于如何让单个服务在两个域上工作有什么想法吗?
好的,将整个 URL 放入端点地址是我没有想到的,所以这让我有所收获。使用自定义 ServiceHostFactory 后,它适用于domain1,但不适用于domain2。我收到了一条以前从未见过的新错误消息:
“没有协议绑定与给定地址匹配'http://domain2.com/Api/Poll.svc/soap'。协议绑定在 IIS 或 WAS 配置中的站点级别进行配置。”
Update:
好吧,我想通了(终于!)。我可以将主机节点添加到服务定义中,并避免在每个端点中使用绝对 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)