6

WCFサービスに2つのメソッドがあります

Method1()
{
 _currentValue = 10;
}

Method2()
{
return _currentValue;
}

Method1()で値を設定し、Method2()で読み取る必要がある状況があります。

staticのような変数を使ってみpublic static int _currentValueましたが、Method2()のMethod1()で設定した値を読み取ることができました。

しかし、問題は、この変数が、要求ごとに個別のインスタンス変数のように反応することです。つまり、今すぐ下に問題があります

ブラウザ1:

 - Method1() is called
    => sets _currentValue = 10;
 - Method2() is called
    => returns _currentValue = 10;

ブラウザ2:

 - Method2() is called
    => returns _currentValue = 10;

実際には、設定された値はブラウザ1は静的であるため、ブラウザ2では同じ値が取得されます。

私が実装しようとしているのは、変数が(各ブラウザーから呼び出すときに)行われた各要求の新しいインスタンスのように機能する必要があるということです。この場合、何を使用すればよいですか?セッション?

4

5 に答える 5

3

WCFサービスにはセッションごとのインスタンスコンテキストモードを使用する必要があるようです。これにより、セッションごとに状態を維持できるため、サービスインスタンスのメンバー変数は、同じプロキシインスタンスからのメソッド呼び出し間で存続します。各ユーザーには独自のセッションがあるため、サービスインスタンスの状態はユーザーによって異なります。

詳細については、次の記事を確認してください:http: //msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2

于 2012-09-18T16:46:05.807 に答える
3

異なるメソッドを呼び出す2つの完全に異なるセッションがあるため、相関のための何らかのメカニズムが必要になります。したがって、両方の呼び出し元が知っている秘密鍵を使用することをお勧めします。

私はあなたの質問から実際に何も集めることができないので、その鍵が何であるかを知ることは少し不可能です、それであなただけがそれを知っています、しかし単純な事実はあなたが相関を必要とするでしょう。さて、彼らが何を使うことができるかを決定したら、あなたはこのようなことをすることができます。

public class SessionState
{
    private Dictionary<string, int> Cache { get; set; }

    public SessionState()
    {
        this.Cache = new Dictionary<string, int>();
    }

    public void SetCachedValue(string key, int val)
    {
        if (!this.Cache.ContainsKey(key))
        {
            this.Cache.Add(key, val);
        }
        else
        {
            this.Cache[key] = val;
        }
    }

    public int GetCachedValue(string key)
    {
        if (!this.Cache.ContainsKey(key))
        {
            return -1;
        }

        return this.Cache[key];
    }
}

public class Service1
{
    private static sessionState = new SessionState();

    public void Method1(string privateKey)
    {
        sessionState.SetCachedValue(privateKey, {some integer value});
    }

    public int Method2(string privateKey)
    {
        return sessionState.GetCachedValue(privateKey);
    }
}
于 2012-09-18T11:24:20.780 に答える
2

変数を作成しましたstatic。これが問題の原因です。 staticつまり、クラスのすべてのインスタンスが変数を共有しますが、実際に必要なのは、次のように、メソッドの外部で宣言された変数だけです。

private int _currentValue;

Method1() 
{ 
    _currentValue = 10; 
} 

Method2() 
{ 
    return _currentValue; 
} 

この変数は、クラスのインスタンスごとに個別に再評価されます。特定のユーザーのリクエスト間でこの値を保持することは、個別の問題です。(セッションは1つの可能な解決策です。)

于 2012-09-18T11:18:18.417 に答える
0

WCFには、WCFサービスインスタンスを制御するための3つの方法が用意されています。

  • 呼び出しごと
  • パーセッション
  • シングルインスタンス

あなたはこれを読むことによって最良の解決策を見つけるでしょう

WCFインスタンス管理を行う3つの方法

于 2013-03-14T07:55:07.380 に答える
0

古いスレッドのように見えますが、誰かがまだ興味を持っている場合は、WCFにサービスの単一インスタンスを実行するように要求するだけでこれを実現できます。次の行(デコレータ)をクラスの定義に追加します[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

同じセッションに対してのみ動作が必要で、クライアント間では動作が必要ない場合は、次のサービス動作によってセッションごとにマークを付けることができます[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

もう1つのオプションは、デフォルトのオプションである呼び出しごとです。[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

于 2013-04-20T08:16:44.577 に答える