我有一个运行了很长时间的 WCF 服务,托管在 IIS6 (Windows Web Server 2003) 中。
我正在尝试在 IIS 中添加第二个主机标头值(以前只有 1 个)。
所以现在在 IIS 中,假设我已经配置:
IP: All Available, Port: 80, Host: x.test.com
IP: All Available, Port: 80, Host: y.test.com
在我的应用程序中,我设置了这个 WCF 配置属性:
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
我有一个习惯ServiceHostFactory
:
public class MySuperServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
//...
}
}
在参数Uri[] baseAddresses
中,WCF 似乎只传递给我 IIS 配置中的第一个值。所以对于这个例子,baseAddresses
是一个Uri[1]
具有一个值的http://x.test.com/MyService.svc
。
如果我在 IIS 中指定 HTTP和HTTPS 主机标头,也会发生同样的事情。回到同一个例子,假设我们设置的 HTTP 流量:
IP: All Available, Port: 80, Host: x.test.com
IP: All Available, Port: 80, Host: y.test.com
对于 SSL 流量,我们运行以下命令:
cscript.exe c:\Inetpub\AdminScripts\adsutil.vbs 设置 /w3svc/12345/SecureBindings ":443:secureA.test.com" ":443:secureB.test.com"
所以现在我的网站应该有 4 个可能的地址。
但是现在 WCF 只是将每种类型的连接中的第一个主机传递给我,所以我现在包含 2 个元素:Uri[]
http://x.test.com/MyService.svc
https://secureA.test.com/MyService.svc
任何人都知道为什么会发生这种情况?
编辑:
此链接“ WCF 如何支持每个站点指定的多个 IIS 绑定? ”在最底部说:
.Net Fx4.0 中的解决方案:BaseAddressPrefixFilters
Beta2 修复
在 .NET Framework 的当前 Beta2 版本中,我们添加了对多站点绑定的支持。只需在 IIS 站点中设置绑定,服务将继承该地址
最终 RTM 修复
最后,出于应用程序兼容性的原因,我们决定选择加入。为了启用多站点绑定,您需要在应用程序中将 multipleSiteBindingEnabled 设置为 true。仅 Http 协议支持多站点绑定。配置文件中的端点地址需要是完整的 URI。将 3.0 或 3.5 解决方法移植到 4.0 时,您需要保留此特定方面。
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
最后一点就是我正在做的事情。我正在使用 .NET4 的附加功能在 IIS 中设置多个主机标头,并multipleSiteBindingsEnabled="true"
在我的配置中设置。
如果您不理会 WCF 的其余部分并让它做默认的事情来构建服务端点,这实际上工作得很好。
但是,我的问题是所有多个主机标头实际上并未传递给自定义ServiceHostFactory
实现,因此在所有基地址上手动设置您自己的端点似乎很困难或不可能。
也许这只是 .NET 4 中的一个错误?