0

クライアントが入ることができる複数のチャットルームを備えたメインロビーを持つnetTcpBindingを使用してWCFサービスを作成しています。Lobbyクラスは、サービスコントラクトとしてILobbyを実装します。

クライアントが部屋に入ることを望むとき、私はクライアントにコールバックして、彼がちょうど入った部屋のInstanceContextを含む新しいチャネルを公開したいのですが、多くの検索の後、これが可能かどうか疑問です。

たとえば、サービス側では

class Lobby : ILobby
{
    Dictionary<string, Chatroom> rooms;

    public void JoinRoom(string roomname)
    {
        if (rooms[roomname].TryEnter()) {}
    }
}

class ChatRoom : IChatRoom
{
    public bool TryEnter(string username)
    {
        ILobbyCallback callback =
            OperationContext.Current.GetCallbackChannel<ILobbyCallback>();
        // How do I do this next bit?
        callback.JoinedRoom(pass some instance context here);
        return true;
    }
}

クライアント側のコールバックメソッドが欲しい

public void JoinedRoom(InstanceContext for the room on the service side)
{
    // Create a new WCF proxy using above InstanceContext
    // Create a WPF UI for the new room passing the proxy so it can communicate
    // with the room class directly without going via the root service
}

これは可能ですか?サービス側で独自のコントラクトを持つ新しいクラスを生成するためのベストプラクティスは何ですか?または、すべてを1つの大規模なMyServiceクラスにバンドルして、すべてを自分で処理する必要がありますか?

4

1 に答える 1

1

インスタンスコンテキストをパラメータとして操作コントラクトに渡すことはできません。そのコンテキストにはローカルスコープがあるため、意味がありません。これは「インスタンスコンテキスト」と呼ばれます=現在のサービスインスタンスのコンテキストです。二重シナリオでは、クライアントとサーバーの両方に独自のサービスがあります。

  • クライアントはプロキシを介してサーバーのサービスを呼び出します
  • サーバーは、受信したコールバックチャネルを介してクライアントのサービスを呼び出します

サーバーのサービスインスタンスコンテキストは、サーバー上でのみ意味を持ちます。何を達成しようとしているのかは明確ではありません(非常に複雑なアーキテクチャを除く)。

  • クライアントでコンテキストを共有したい場合は、作成した最初のプロキシに使用されたインスタンスコンテキストを渡すことを試みることができます-それが機能するかどうかはわかりませんが、試すことができます
  • 複数のプロキシ間でサービスインスタンスコンテキストを共有する場合は、独自のプロキシを開発する必要があります。IInstanceContextProviderまた、IInstanceProvider(達成したい内容に応じて)独自のプロキシを開発し、動作にラップしてサービスに追加する必要があります。これにより、セッション処理の全体的な複雑さと正しいインスタンスの解放が制御下に置かれます(明らかに長所と短所があります)。

しかし、それは本当に必要ですか?あなたのコードを見ると、1つのサービスと1つのプロキシで十分であることがわかります。また、JoinRoom操作でコールバックを使用する必要はまったくなく、要求応答メソッドにすることができます。

于 2011-09-15T07:25:10.067 に答える