【问题标题】:WCF ServiceHost BaseAddresses does not contain all IIS host header values, when multiple Host Headers set in IISWCF ServiceHost BaseAddresses 不包含所有 IIS 主机标头值,当在 IIS 中设置多个主机标头时
【发布时间】: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,这不是完整的列表。
  • 我在原始帖子中添加了更多信息。请参阅“编辑”部分。

标签: .net wcf iis iis-6


【解决方案1】:

在您的自定义类中,您是否手动添加其他端点?我确实相信它的设计方式需要您手动完成...

http://msdn.microsoft.com/en-us/library/ms751515.aspx

有了这个概念,如果 EndPoint 是配置,那么它将为您添加。由于您的配置为空,您必须手动添加端点。

WCF Self Host Service - Endpoints in C#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多