2009-01-07 96 views
10

我的僱主網站有多個主機名稱,所有主機名稱都在同一臺服務器上,我們只是爲品牌目的顯示不同的皮膚。WCF和多主機接頭

不幸的是WCF在這種情況下似乎不能很好地工作。我試過overriding the default host with a custom host factory

因爲它需要來自所有主機的工作不是一個可接受的解決方案,而不僅僅是1

我也看了this blog post但無論是我無法得到它的工作也並不意味着解決我的問題。

我得到的錯誤是「此集合中已包含與計劃http地址」

還有得是配置此方式,請幫助:)

+0

你是否用IIS託管你的WCF或者你在建立一個自定義託管服務提供者? – thaBadDawg 2009-01-07 22:33:16

+0

另外,您有什麼具體問題/問題?即該服務不起作用,返回不正確的響應(URL),還是服務不知道哪個客戶端正在進行呼叫? – 2009-01-07 22:51:02

+0

我與IIS託管 – Ryu 2009-01-09 22:34:25

回答

5

如果你不把一個地址在端點然後它應該解決任何服務器命中服務。我使用這個代碼,它解決了我的.local地址和我的.com地址從IIS。

<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> 
+0

當您有多個主機頭時,此方案是否工作?它看起來不適合我(ASP.NET 3.5/IIS 6)。 zcrar70的帖子似乎同意。 – russau 2010-08-25 03:02:54

-1

我相信你現在已經知道了,但只是爲了好玩,無論如何我都會在這裏發帖。

我已經有了這個確切的問題,並永遠花費在試圖弄清楚。最好的解決方案是將主機基地址置於您的服務定義中,這允許服務在這些多個地址下運行。要使此解決方案能夠工作,您仍然需要重寫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> 
5

我不認爲主機基址解決方案上面貼會爲IIS託管的網站的工作(在OP沒有提到這是他僱主的網站)。

this blog post

而且,對方的回答進一步增長thaBadDawg其中指定了多個主機頭將無法​​正常工作 - 你只得到了錯誤的OP提到(「這個系列已經包含了地址與計劃http「。)

我不認爲到目前爲止提到的任何解決方案將工作,因爲它看起來不像WCF允許單個站點可以訪問單個站點與多個主機頭從所有的網站。我唯一可以找到的.net 3.5(和下)的解決方法是爲每個主機頭創建一個不同的協定,並使用自定義的ServiceHostFactory根據指定的合約使用正確的主機頭。這根本不實際。顯然.Net 4.0 will resolve this issue

3

幾天前我遇到了這個問題。事實上,我和Ryu最初在他的問題中所描述的情況一樣。我們有許多客戶的虛擬目錄,但他們每個人都有自己的綁定。像「http://company1.product.com」,「http://company2.product.com」等

解決方案描述here的作品。但是什麼是價格!每當我們需要添加新的綁定時,我們應該改變web.config。也是網絡。config應包含絕對路徑前綴 ,如<add prefix=」http://company1.product.com」/>

可以繞過第一個問題。我爲WCF服務編寫了我自己的CustomHostFactory,我在那裏動態添加端點。我從IIS綁定中檢索這個端點(有一種方法可以從IIS獲取信息)。

下面是示例代碼:和

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; 
} 

,而不是硬編碼端點的網址,您從前人的精力IIS檢索。 但是應用程序啓動時會創建一次ServiceHost。所以如果你需要添加新的綁定,你應該重新啓動IIS。這不是我們的解決方案。

這就是爲什麼我們決定轉移到asmx(如描述here)。 並等到Framework 4.0發佈,其中應支持多個綁定。

0

不涉及任何代碼或配置更改的簡單解決方法是在IIS中創建另一個指向相同物理目錄和相同應用程序池但具有不同主機頭標頭綁定的網站。這可以像你一樣爲許多不同的主機名完成。