C# WCF和多主机头

C# WCF和多主机头,c#,wcf,iis,iis-6,C#,Wcf,Iis,Iis 6,我的雇主网站有多个主机名,所有主机名都访问同一台服务器,我们只是为了品牌目的显示不同的外观 不幸的是,WCF在这种情况下似乎没有很好地工作 我试过了 这不是一个可接受的解决方案,因为它需要在所有主机上工作,而不仅仅是1台 我也看过,但要么我不能让它工作,要么它不是为了解决我的问题 我得到的错误是“此集合已包含具有方案http的地址” 必须有一种方法来配置它,请帮助:)如果您没有在端点中放置地址,那么它应该解析为任何服务器访问服务。我使用此代码,它从IIS解析为my.local地址和my.com地

我的雇主网站有多个主机名,所有主机名都访问同一台服务器,我们只是为了品牌目的显示不同的外观

不幸的是,WCF在这种情况下似乎没有很好地工作

我试过了

这不是一个可接受的解决方案,因为它需要在所有主机上工作,而不仅仅是1台

我也看过,但要么我不能让它工作,要么它不是为了解决我的问题


我得到的错误是“此集合已包含具有方案http的地址”


必须有一种方法来配置它,请帮助:)

如果您没有在端点中放置地址,那么它应该解析为任何服务器访问服务。我使用此代码,它从IIS解析为my.local地址和my.com地址

<system.serviceModel>
    <services>
        <service name="ServiceName" behaviorConfiguration="ServiceName.Service1Behavior">
            <endpoint address="" binding="wsHttpBinding" contract="iServiceName">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceName.Service1Behavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

我相信你现在已经明白了,但为了好玩,我还是会在这里发布

我遇到了这个问题,花了很多时间试图解决它。最好的解决方案是将主机基址放在服务定义中,这允许服务在这些多个地址下运行。要使此解决方案正常工作,仍然需要重写ServiceHostFactory。既然你已经这么做了,就把它放在那里吧

<service behaviorConfiguration="ServiceBehaviour" name="Api.Service">
    <endpoint address="soap" binding="basicHttpBinding" contract="Api.IService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://host1.com/Api" />
        <add baseAddress="http://host2.com/Api" />
      </baseAddresses>
    </host>
  </service>

我认为上面发布的主机基本地址解决方案不适用于IIS托管的网站(OP确实提到这是针对其雇主的网站)


另外,thaBadDawg进一步给出的另一个答案在指定多个主机头的情况下不起作用-您只会得到OP提到的错误(“此集合已经包含一个带有scheme http的地址”。)


我认为到目前为止提到的任何解决方案都不起作用,因为WCF看起来不允许对一个站点使用来自所有站点的多个主机头访问单个服务。对于.Net 3.5(及以下版本),我能找到的唯一解决方法是为每个主机标头创建不同的协定,并使用自定义ServiceHostFactory使用正确的主机标头,根据该标头指定协定。这根本不切实际。显然。

我几天前遇到了这个问题。事实上,我的情况与Ryu最初在问题中描述的情况相同。我们为许多客户提供了一个虚拟目录,但每个客户都有自己的绑定。比如“,”等等

描述的解决方案有效。但代价是什么!每次需要添加新绑定时,我们都应该更改web.config。而且web.config应该包含绝对路径前缀 比如
)。

等待Framework 4.0发行版,在该版本中应支持多个绑定。

一个不涉及任何代码或配置更改的简单解决方法是在IIS中创建另一个网站,该网站指向相同的物理目录和相同的应用程序池,但具有不同的主机头绑定。这可以针对尽可能多的不同主机名执行。

您是使用IIS托管WCF,还是正在构建自定义托管提供商?另外,您有什么具体问题/问题?也就是说,服务是否不起作用、返回不正确的响应(URL)或服务是否不知道哪个客户端正在进行调用?此集合已包含一个带有scheme Http的地址。当您有多个主机标头时,此方案是否起作用?它似乎不适合我(ASP.NET 3.5/IIS 6)。ZCRA70的帖子似乎同意。在IIS中,基本地址被忽略。(“在IIS中托管时完全忽略了这一点”)不幸的是,这对我也不起作用…仍在寻找解决方案。另一个解决方法是Strutanov提到的方法。基本上,您只需为每个主机创建不同的端点(无需更改契约)。使用.NET 4.0,您不再需要在配置中指定所有主机头,只需添加Rampo博客中描述的
。谢谢你的链接。
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
    var serviceHost = base.CreateServiceHost(serviceType, baseAddresses);
    var webHttpBinding = new WebHttpBinding();
    var serviceEndpoint1 = serviceHost.AddServiceEndpoint(typeof(IService), webHttpBinding,
                                                         "http://company2.product.com/WCFService/Service.svc");

    var serviceEndpoint2 = serviceHost.AddServiceEndpoint(typeof(IService), webHttpBinding,
                                                 "http://company1.product.com/WCFService/Service.svc");

    var webHttpBehavior = new WebHttpBehavior();

    serviceEndpoint1.Behaviors.Add(webHttpBehavior);
    serviceEndpoint2.Behaviors.Add(webHttpBehavior);

    return serviceHost;
}