【发布时间】:2012-05-20 10:41:23
【问题描述】:
我有一个已经运行了很长时间的 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 配置中的 first 值传递给我。所以对于这个例子,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 只是将每个 type 连接中的 first 主机传递给我,所以我的 Uri[] 现在包含 2 个元素:
http://x.test.com/MyService.svc
https://secureA.test.com/MyService.svc
有人知道为什么会发生这种情况吗?
编辑:
这个链接“How can WCF support multiple IIS Binding specified per site ?”在最底部说:
.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 中的一个错误?
【问题讨论】:
-
我可以看看你的app.config吗
-
this 有帮助吗?
-
我的 web.config 实际上是空的,而是全部在代码中配置。我所拥有的与您链接中@struhtanov 的答案非常相似,除了在他的答案中他在两个单独的基地址中进行了硬编码。我试图使用给定的那些作为我的 IIS,这不是完整的列表。
-
我在原始帖子中添加了更多信息。请参阅“编辑”部分。