簡體   English   中英

WCF 服務啟動錯誤“此集合已包含具有方案 http 的地址”

[英]WCF service startup error "This collection already contains an address with scheme http"

我構建了一個 Web 應用程序,其中包含一個 WCF 服務合同和一個調用該 WCF 服務的 Silverlight 控件。 在我的開發和測試服務器上,它運行良好。

當我部署到我們的實時服務器並運行應用程序時,我得到一個System.ServiceModel.ServiceActivationException類型的異常,它指出由於編譯期間出現異常,無法激活服務。 例外是:

這個集合已經包含一個帶有 http 方案的地址。 在此集合中,每個方案最多可以有一個地址。

我讀到如果網站有多個主機標頭,則可能會引發此異常,這在我們的實時服務器上是正確的。 顯然,IIS 中承載的 WCF 服務只能有一個基地址。 我怎樣才能解決這個問題?

在 .Net 4 中,您可以使用multipleSiteBindingsEnabled選項:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

然后,您不必指定每個地址。

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

概括,

代碼解決方案: 這里

配置方案: 這里

Mike Chaliy的幫助下,我找到了一些有關如何通過代碼執行此操作的解決方案。 因為這個問題幾乎會影響我們部署到實時環境的所有項目,所以我堅持純粹的配置解決方案。 我最終找到了一個詳細說明如何在 .net 3.0 和 .net 3.5 中執行此操作的文章。

取自該站點,以下是如何更改應用程序 Web 配置的示例:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

在上面的例子中,net.tcp://payroll.myorg.com:8000 和http://shipping.myorg.com:9000是它們各自方案的唯一基地址,它們將被允許通過。 baseAddressPrefixFilter 不支持任何通配符。

IIS 提供的 baseAddresses 可能具有綁定到 baseAddressPrefixFilter 列表中不存在的其他方案的地址。 這些地址不會被過濾掉。

Dns 解決方案(未經測試):我認為,如果您創建了一個特定於您的 Web 應用程序的新 dns 條目,添加了一個新網站,並為其提供了一個與 dns 條目匹配的單個主機標頭,您將完全緩解這個問題,並且不會必須編寫自定義代碼或向 web.config 文件添加前綴。

你看到了嗎 - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

您可以通過更改 web.config 文件來解決此錯誤。

使用 ASP.NET 4.0,將以下行添加到您的 web.config:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

使用 ASP.NET 2.0/3.0/3.5,將以下行添加到您的 web.config:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

在我的例子中,這個問題的根本原因是在父網站上定義了多個 http 綁定,即 InetMgr->Sites->Mysite->properties->EditBindings。 我刪除了一個不需要的 http 綁定,問題得到了解決。

就我而言,這很簡單:我在 Visual Studio 中使用了“添加 WCF 服務”向導,它會在 app.config 中自動創建相應的部分。 然后我繼續閱讀如何:在托管應用程序中托管 WCF 服務 問題是:我不需要指定 url 來運行 Web 服務。

代替:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

和:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

錯誤消失了。

一般想法:如果您提供基地址作為參數在配置中指定它,則會出現此錯誤。 很可能,這不是獲得錯誤的唯一方法,你。

我遇到了這個問題,原因很愚蠢。 我正在嘗試 Microsoft 的關於從命令行可執行文件運行 ServiceHost 的演示。 我按照說明進行操作,包括它所說的添加適當的服務(和接口)的位置。 但我得到了上述錯誤。

原來,當我添加服務類時,VS 會自動將配置添加到 app.config 中。 演示也試圖添加該信息。 由於它已經在配置中,我刪除了演示部分,並且它起作用了。

我在舊的 2010 Exchange Server 上遇到了同樣的錯誤。 一項服務(Exchange 郵箱復制服務)出現上述錯誤,無法繼續遷移過程。 通過互聯網搜索,我來到這個鏈接,其中說明如下:

首次安裝或對 IIS 服務器進行任何更改時,Exchange GRE 無法打開。 它因管理單元錯誤而失敗,當您嘗試打開管理單元頁面時,會顯示以下內容:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

原因:發生此錯誤的原因是 http 端口號 443 已被另一個應用程序使用,並且 IIS 服務器未配置為處理到同一端口的多個綁定。

解決方案:配置 IIS 服務器以處理多個端口綁定。 請聯系供應商 (Microsoft) 進行配置。

由於這些服務是從 IIS Web 服務器提供的,檢查根站點上的綁定解決了問題。 有人弄亂了站點綁定,定義了重疊的規則並弄亂了服務。

修復正確的綁定解決了這個問題,就我而言,我不必配置 Web.Config。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM