2008-02-15

WCF 錯誤: 此集合已包含具有配置 http 的位址。此集合中,每一配置最多只能有一個位址。

WCF Service 佈署到 IIS Application Server 之後, 剛開始運作的很順利, 但是後來卻發生以下的問題:

WCF 錯誤: 此集合已包含具有配置 http 的位址。此集合中,每一配置最多只能有一個位址。

剛開始以為是 WCF 有問題, 可是後來重新啟動 IIS 也沒有解決, 所以初步認定應該是設定上的問題, 趕快找 Google 問看看, 輸入錯誤訊息, 搜尋...果然, 找不到想要的, 因為我輸入的是中文...唉...每次都這樣, 只好先嘗試猜測把關鍵字翻譯成英文 collection contains http address, 再搜尋一次, 這一次 Google 終於聽懂我的問題了, 馬上告訴我問題的原因和解決的方法!!

原來是因為 IIS 的站台設定了多重識別才造成這樣的問題, 解決的方法很簡單, 就是在多重識別的設定頁留下一個就好, 其他的移除掉, 問題就可以解決了!!

 

謎之音: 那如果多重識別一定得有多個怎麼辦? 難不成就不能享用 WCF 了嗎?

 

...呃! 我也很想知道, 畢竟只能留一個這樣子的解決方式有點遜, 不算是一個好的解決方案! 那該怎麼做呢, 很簡單, 只要兩個步驟:

  1. 建立一個類別繼承 ServiceHostFactory, 並覆寫 CreateServiceHost 方法, 如下
    public class CustomServiceFactory: ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(TypeserviceType, Uri[] baseAddresses)
        {
            return new ServiceHost(serviceType, baseAddresses[0]);
        }
    }
  2. 在原來的 .svc 檔頭部分多加上一個 Factory 屬性的設定, 雖然 intellisense 不會出現, 但是請相信專業, 這個屬性是存在的, 不相信的話請看 Reflector!
    <%@ServiceHost Language="C#" Debug="true" Service="MyCustomService" Factory="CustomServiceFactory"%>

只要這兩步就可以輕鬆解決這個討厭的問題啦!!

2 則留言:

查理在台灣 提到...

想請教的是,這道理是什麼呢?為什麼這樣改就可以了?有沒有什麼副作用?

San Chen 提到...

範例碼中的 baseAddresses[0] 是示範用的, 實際使用時還是要從 baseAddresses 陣列中挑出對的才是, 它的設計如此, 所以只要指定對 address, 是不會有什麼副作用的!