我有一个环境,在同一台服务器上托管的多个站点将使用单个服务进行调用.例如:
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>
Run Code Online (Sandbox Code Playgroud)
但是这只适用于域1,因为你只允许一个baseAddressPrefixFilter(他们不应该把它baseAddressPrefixFilter 小号,如果你只允许一个).我尝试构建一个自定义的ServiceHostFactory来绕过它,但是在激活过程中调用ServiceHostFactory之前我遇到了过滤器问题.
关于如何让单个服务在这样的2个域上工作的任何想法?
好的,将整个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>
Run Code Online (Sandbox Code Playgroud)
我担心我将不得不为每个绑定编写一个端点,这可能需要管理很多额外的配置.这个解决方案很棒,因为我不需要这样做,它更简洁一些.
作为参考,这是我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16018 次 |
| 最近记录: |