0

WCF 関数

    public void SetSession(string name)
    {
            HttpContext.Current.Session["abc"]=name;
    }
    public string GetSession(string name)
    {
            return HttpContext.Current.Session["abc"].ToString();
    }

プロキシー

     using (ServiceReference1.BlackjackClient proxy = new ServiceReference1.BlackjackClient())
        {
            proxy.SetSession("Hello");
        }

私の問題は、複数のクライアントがサービスにアクセスしているときに、各クライアントが最後に設定されたセッションにアクセスすることです。セッションはブラウザー要求ベースではなく、クライアントを認識しません。どのクライアントがどのリクエストを送信したか。それらを各クライアントに固有のものにするにはどうすればよいですか。各クライアントが独自のセッションを持つ必要があることを意味します。

助けてください

4

1 に答える 1

1

サービスは、どのクライアントがサービスを呼び出しているかを認識できません。通常のasp.netの使用でSessionは、各リクエストを識別し、リクエストを正しいセッションにマップするための内部ブードゥーを作成するCookieを使用します。

あなたの場合、クライアントからのログインを使用して、サービスがリクエストを識別できるようにする必要がありますが、これだけでは問題は解決しません。

サービスの実装にアクセスできるため、おそらく最も簡単な解決策は、セッション識別子 (a Guid) をクライアントに格納し、これを各リクエストに沿って Web サービスに送信して変更することです。

    public void SetSession(string name)
    {
            HttpContext.Current.Session["abc"]=name;
    }
    public string GetSession(string name)
    {
            return HttpContext.Current.Session["abc"].ToString();
    }

のようなものに

public void SetSession(string name, Guid sessionId)
{
        HttpContext.Current.Session[sessionId + "_abc"]=name;
}
public string GetSession(string name, Guid sessionId)
{
        return HttpContext.Current.Session[sessionId + "_abc"].ToString();
}

このようにメソッド シグネチャを変更するのはかなり見苦しいですが、クライアントはサーバーが呼び出し元とセッションを識別するのを支援するという考えになります。

トランスポート プロトコルを使用して呼び出し元を識別する方がクリーンになるため、HTTP サービスを作成している場合は、http ヘッダー (おそらく承認) を使用してセッション識別子を含めることができます。SOAP を使用している場合は、メッセージ ヘッダーに同じ情報が含まれている可能性があります。

セッション識別子は、 のような名前の新しいメソッドによってサービスで作成することもできますGuid CreateSession()。ただし、クライアントで Guid を作成することもできます。

ただし、繰り返しになりますが、一意のセッション ID またはユーザー資格情報をクライアントに保存し、各要求でそれらをサーバーに伝える必要があります。

于 2013-01-04T11:16:16.817 に答える