3

現在のセッションでは、単一のソケットを作成し、すべてのページで接続を維持する必要があるASP.NETサイトで作業しています。ソケットをセッションオブジェクトとして作成して保存しました。ページリダイレクト後も接続されたままですが、ポストバックが発生するたびに接続が閉じられます(ボタンのクリックなど)。セッション全体で単一の接続を使用する必要があり、ソケットを再接続することはできないため、ポストバック後もソケット接続を開いたままにする方法はありますか?

4

1 に答える 1

0

セッション状態は脆弱です。実際、シリアル化セッション状態プロバイダーを使用している場合でも、説明した内容は機能しません(ソケットはシリアル化できません)。

つまり、ソケットをセッションに保存するのではなく、ソケットを別の場所(同期された辞書など)に配置し、そのキーだけをセッションに保存します。例えば:

public static class SocketStore
{
    static readonly Dictionary<string, Socket> socketStore
          = new Dictionary<string, Socket>();
    public static string Add(Socket socket)
    {
        if(socket == null) throw new ArgumentNullException("socket");
        string newKey = Guid.NewGuid().ToString();
        lock(socketStore) {
            socketStore.Add(newKey, socket);
        }
        return newKey;
    }
    public static Socket Get(string key)
    {
        if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key");
        Socket result;
        lock (socketStore)
        {
            if (!socketStore.TryGetValue(key, out result)) result = null;
        }
        return result;
    }
}

使用法では、ソケット(/ key)がまだない場合は、接続を作成し、を使用して保存してAddから、セッションにキーを保存します。フェッチするときは、nullケースを処理する必要があります。また、同じセッションからの2つの同時リクエストによって同じソケットが使用されるのを防ぐために、独自の同期を追加する必要があります(完全に合法)。

ただし、追記として:

  • 放棄されたセッションから古いソケットをクリーンアップするための追加のプロセスと、正常に見えるセッションからのゾンビソケットが必要になります。
  • 同じサーバーに戻ってくるようにリクエストする必要があります。クラスター内にいる場合は、「スティッキー」な負荷分散が必要になります。
于 2012-09-21T07:04:20.340 に答える