我有一个环境,在同一台服务器上托管的多个站点将使用单个服务进行调用.例如:
http://domain1.com/Api/Service.svc
http://domain2.com/Api/Service.svc
Api应用程序已设置为映射到同一物理目录的每个站点中的虚拟目录,因此源仅位于一个位置.问题是WCF不喜欢为其服务端点提供多个基地址.为了使服务工作,我不得不添加一个基地址前缀过滤器:
但是这只适用于域1,因为你只允许一个baseAddressPrefixFilter(他们不应该把它baseAddressPrefixFilter 小号,如果你只允许一个).我尝试构建一个自定义的ServiceHostFactory来绕过它,但是在激活过程中调用ServiceHostFactory之前我遇到了过滤器问题.
关于如何让单个服务在这样的2个域上工作的任何想法?
好的,将整个URL放在端点地址中是我没想过的,所以这让我到了某个地方.使用自定义ServiceHostFactory后,适用于domain1,但不适用于domain2.我收到了一条我以前没见过的新错误消息:
"没有协议绑定与给定地址匹配' http://domain2.com/Api/Poll.svc/soap '.协议绑定在IIS或WAS配置中的站点级别配置."
更新:
好吧,我想通了(最后!).我可以将主机节点添加到服务定义中,并避免在每个端点中使用绝对URL.我还删除了BaseAddressPrefixFilter,但在解决方案中保留了自定义ServiceHostFactory.
我担心我将不得不为每个绑定编写一个端点,这可能需要管理很多额外的配置.这个解决方案很棒,因为我不需要这样做,它更简洁一些.
作为参考,这是我的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; } }