WCFサービス起動エラー「このコレクションには、スキームhttpのアドレスがすでに含まれています」


182

WCFサービスコントラクトと、そのWCFサービスを呼び出すSilverlightコントロールを含むWebアプリケーションを構築しました。私の開発サーバーとテストサーバーでは、うまく機能します。

ライブサーバーにデプロイしてアプリケーションを実行すると、System.ServiceModel.ServiceActivationExceptionコンパイル中の例外が原因でサービスをアクティブ化できないことを示すタイプの例外が発生します。例外は次のとおりです。

このコレクションには、スキームhttpのアドレスが既に含まれています。このコレクションでは、スキームごとに最大1つのアドレスが存在できます。

この例外は、Webサイトに複数のホストヘッダーがある場合にスローされる可能性があることを読みました。これは、ライブサーバーでも同様です。どうやらIISでホストされているWCFサービスは、1つのベースアドレスしか持つことができません。この問題を回避するにはどうすればよいですか?

回答:


167

.Net 4では、次のmultipleSiteBindingsEnabledオプションを使用できます。

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

その後、各アドレスを指定する必要はありません。

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


はい。ただし、これは.NET 4.0以降でのみ機能します。.NET 2.0 / 3.0 / 3.5サイトではこれを使用できません。
Bytemaster

2
注-ここにタイプミスがあります-終わりはありません>したがって、コピーして貼り付けると問題が発生します
sydneyos

2
「この機能はHTTPプロトコルを使用した場合にのみ利用可能です」という質問には機能しません。
George Tsiokos、2011年

146

概要、

コードソリューション: ここ

構成ソリューション: ここ

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エントリを作成し、新しいWebサイトを追加し、DNSエントリに一致する単一のホストヘッダーを与えた場合、この問題は完全に軽減され、カスタムコードを記述するか、web.configファイルにプレフィックスを追加する必要があります。


2
ベースアドレスプレフィックスフィルターをweb.configに追加すると、完全に機能しました。ジェレミー、ありがとう!
Mike737 2009

2
私は、デフォルトの設定をはるかに下回って、そのような制限が必要になる理由は考えられません...
pbz 2009年

42
ASP.netとJavaScriptを介してアクセスするWebサービスを組み合わせたWCFについて、私はひどく考え始めています。私は普通の古いASMXサービスで問題がはるかに少なかった...
Juri

.net 4と.net 2のアプリケーションが混在しているサイトがある場合はどうでしょう。アプリケーションのベースは.net4で、その下に.net2を必要とするアプリケーションがいくつかあります。すべての.net4ファイルと.net 2アプリケーションのプレフィックスで<serviceHostingEnvironment multipleSiteBindingsEnabled = "true">を使用していますか?
Travis

59

これを見ましたか-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> 

ありがとう。コードではない解決策があるかどうかを確認するために検索を続けます。これは、カスタムコードを記述する必要がないことを期待しているプロジェクトに影響を与えるため、構成で実行できる何かです。
ジェレミー、

16

私の場合、この問題の根本的な原因は、親Webサイトで定義された複数のhttpバインディング、つまりInetMgr-> Sites-> Mysite-> properties-> EditBindingsでした。不要なHTTPバインディングを1つ削除したところ、問題は解決しました。


1
はい、これは非常に役に立ちました-私の場合、それはそれを壊した複数のバインディングを持つ別のウェブサイトでした。同じマシンで外部的に利用可能(ただし、ホスト名が異なる)。同様に、multipleSiteBindingsEnabled設定を追加することで修正できますが、web.configは他のすべての環境とは異なります。
コーダー、2014年

2
これが一番下にあるのは残念です。私たちの場合、これで修正されました。
brendonparker 14

開発環境でエラーを再現するのに役立ちました。認定環境でもライブ環境でも、Webサイトのバインディングを編集できません。hostsファイルを変更してドメインをシミュレートし、ローカルIISとbamへのバインディングを追加しました!
MFedatto 2016

8

そして、私の場合、それは単純でした:私は、app.configに対応するセクションを自動的に作成するVisual Studioの「WCFサービスの追加」ウィザードを使用しました。次に、「方法:マネージアプリケーションでWCFサービスをホストする」を読みました。問題は、Webサービスを実行するためにURLを指定する必要がないことでした。

交換:

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

と:

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

そして、エラーはなくなりました。

一般的なアイデア:パラメータとしてベースアドレス指定し、それを構成で指定すると、このエラーが発生します。おそらく、それがエラーを取得する唯一の方法ではありません。


私の問題を解決しました。
QShengyao 2017

2

私にはこの問題があり、原因はかなりばかげていました。コマンドラインの実行可能ファイル内からServiceHostを実行することに関するMicrosoftのデモを試していました。私は、適切なサービス(およびインターフェース)を追加するように指示されている場所を含め、指示に従いました。しかし、上記のエラーが発生しました。

サービスクラスを追加すると、VSが構成をapp.configに自動的に追加したことがわかります。そしてデモもその情報を追加しようとしていました。すでに構成に含まれているので、デモ部分を削除して動作しました。


0

古い2010 Exchange Serverでも同じエラーが発生しました。サービス(Exchangeメールボックスレプリケーションサービス)が上記のエラーを出しているため、移行プロセスを続行できませんでした。インターネットで検索したところ、以下のリンクが表示されました。

Exchange GREは、初めてインストールされたとき、またはIISサーバーに変更が加えられたときに開くことができません。スナップインエラーで失敗し、スナップインページを開こうとすると、次のコンテンツが表示されます。

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を構成する必要はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.