3

初めて WCF を試していますが、ホストをインスタンス化しようとすると次のエラーが発生します。

このコレクションには、スキーム http... のアドレスが既に含まれています。

これに関する他の多くの参照を見つけて、いくつかの解決策を試してみましたが、役に立ちませんでした。私には当てはまらないかなり一般的なスレッドの 1 つは、問題が何らかの Web サーバーにあるということです。ローカルマシンからすべてを実行しているだけです。

私が見つけた興味深い症状の 1 つは、ac# Forms アプリを開発していることです。もともと、最上位のフォーム オブジェクトは、個別の Service クラスではなく、サービス インターフェイスを継承していました。この方法で実装すると、ホスト側ではエラーが発生しませんが、クライアント側で問題が発生しています。

この解決策に基づいて: 「ChannelDispatcher は IChannelListener を開くことができません」というエラーを解決する方法は?

...サービス ホストを別のオブジェクトに分離することにしました。その時、私は問題を見始めます。

ServiceContract は非常に単純です。

[ServiceContract]
public interface ISSAService
{
    [OperationContract]
    void CreateSpaMonitor();
}

次のようにサービスをインスタンス化します。

        Uri baseAddr = new Uri("http://localhost:8000/SSAService");
        ServiceHost localHost = new ServiceHost(typeof(SSAService), baseAddr);

ここで、SSAService は Service インターフェースの実装です。

2行目を次のように変更すると(そしてインターフェースを実装します...)、エラーは消えます:

        Uri baseAddr = new Uri("http://localhost:8000/SSAService");
        ServiceHost localHost = new ServiceHost(typeof(SSAManager), baseAddr);

SSAManager は、私の最上位の Forms クラスです...

次に、私が始めたクライアント側の問題に遭遇しました....

ポート番号を変更してみましたが、何の影響もないようです。

私はWCFが初めてなので、明らかな何かが欠けているかもしれません。

ありがとう。

4

3 に答える 3

2

このエラーが発生していました:

このコレクションには、スキーム https のアドレスが既に含まれています。このコレクションには、スキームごとに 1 つのアドレスしか存在できません。サービスが IIS でホストされている場合は、'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' を true に設定するか、'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters' を指定することで問題を解決できます。パラメータ名:item

web.configに次のことを行うことで解決しました。以前は必要なかったので、この行を必要とする .NET Framework 4 で何かが変更された可能性があります。

<system.serviceModel>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />           
    <!--  Rest of the system.serviceModel content omitted for brevity--->

<system.serviceModel>
于 2013-06-05T02:00:36.277 に答える
1

これは、同じ IIS サイトに異なるドメイン名/ポートを持つ複数のバインドがある場合にも発生する可能性があります。余分な名前付きバインディングを削除することで問題を解決しました。

于 2014-01-22T00:08:33.703 に答える
0

以前に見つけた解決策の 1 つは、次のようなものを追加することでした。

  <serviceHostingEnvironment>
    <baseAddressPrefixFilters>
      <add prefix="http://localhost:8000"/>
    </baseAddressPrefixFilters>
  </serviceHostingEnvironment>

そして、エンドポイントアドレスを絶対に指定します。これは効果がないように見えましたが、上記のようにコンストラクターで baseAddr を使用していました。

私にとっての解決策は、コンストラクターから baseAddr を削除することでした。

于 2012-10-08T23:38:37.537 に答える