1

2 つのコントラクトを実装するサービスを app.config に追加するのに問題があるため、2 つのエンドポイントが必要です。

私がやろうとしていることの基本的な例については、この質問を参照してください。

別々のエンドポイントに複数のコントラクトを実装するサービス クラスの WCF 構成

クライアントでサービス参照を使用してプロキシを作成および維持したいのですが、2 つのエンドポイントを持つサービスでこれを実行しようとすると、メタデータをダウンロードしようとすると詳細に次のエラーが表示されます。

メタデータに解決できない参照が含まれています

これは、wcf サービス ライブラリの app.config でサービスをセットアップする方法の例です。

  <service name="MyService">
    <endpoint address="Address1" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service1" contract="IService1" />
    <endpoint address="Address2" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service2" contract="IService2" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
      name="mex" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/" />
      </baseAddresses>
    </host>
  </service>

シンプルなものが欠けているような気がします。エンドポイントの 1 つを削除すると、すべて正常に動作します。しかし、そこに両方の​​エンドポイントがあると、メタデータを解決できません。

ベースアドレスを削除して完全なアドレスを使用しようとしましたが、異なるポートを使用しましたが、試したすべてのパスで同じエラーが発生しました。


編集:そもそもなぜこれをやろうとしているのかを明確にする必要があります。クライアントが接続できるようにしたいシングルトン サービスがあります。ただし、クライアントにアクセスさせたくないメソッドがいくつかあります。管理メソッドとクライアント メソッドを 2 つの別個のコントラクトに分離することは、良い出発点になると思いました。

さらに明確にするために、これはゲームサーバーです。ゲーム サーバーの新しいインスタンスを開始して、マップなどを送信できるようにしたいと考えています。ゲーマーが LoadMap() などのメソッドにアクセスできるようにしたくありません。ゲーム クライアントが持つメソッドとコールバックと、マッチ メイキング サービスまたはサーバー管理者が持つメソッドとコールバックを分離したいと考えています。

また、読みやすく維持しやすくするために、それらを別個の契約にしたいと考えています。

ただし、それを行うためのより良い方法がある場合は、提案を受け付けています。

4

1 に答える 1

0

これを理解するのにしばらく時間がかかりました。私は自分のプロジェクトを解体し、最初から壊れるまで再構築を始めました。

これを行おうとすると、コールバック コントラクトに同じ名前の 2 つのコールバック メソッドを含めることはできないようです。

例:

public interface IService1Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}

public interface IService2Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}

これらをサービス コントラクトのコールバック コントラクトとして設定すると、次のようになります。

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
    [OperationContract(IsInitiating = true)]
    string GetData(int value);
}

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService2Callback))]
public interface IService2
{
    [OperationContract(IsInitiating = true)]
    string GetOtherData(int value);
}

元の質問で述べたエラーが発生します。

これは、エンドポイントが同じ名前を持っているため、メソッドがどのコールバック コントラクトから来ているかをエンド ポイントが把握できず、メタデータが参照を解決できないためだと思います。

幸いなことに、同じ名前のコールバックはありませんが、物事を進めるためにいくつかのダミー メソッドをセットアップしたばかりだったので、しばらくこれに行き詰まりました。

于 2012-12-22T16:27:19.010 に答える