1

これを使用する場合: InstanceContextMode.PerSession の場合、クライアントごとにサービスを 1 回初期化します。私は正しいですか?

[OperationBehavior(TransactionScopeRequired = true)] を持つメソッドを呼び出すと、JobImplement コンストラクターが呼び出されます。なんで?

私のサービス:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class JobImplement : IJob
    {
        public static int Sum = 0;
        public JobImplement()
        {
            Sum++;
        }
        [OperationBehavior(TransactionScopeRequired = true)]
        public void UselessMethod1()
        {
        }
        [OperationBehavior(TransactionScopeRequired = true)]
        public void AddEmployee(string Name, string Age)
        {
        }
        public int GetSum()
        {
            return Sum;
        }
    }

編集1:

私は WSHttpBinding バインディングを使用しています。これが私の唯一のクライアント コードです。

私の顧客:

static void Main(string[] args)
        {
            ServiceReference1.IJob Service1 = new ServiceReference1.JobClient();
            Service1.UselessMethod1();//sum become [1]
            Service1.AddEmployee("","");//sum become [2]
            Console.WriteLine(Service1.GetSum());//show [2].
            Console.WriteLine(Service1.GetSum());//show [2].
            Console.WriteLine(Service1.GetSum());//show [2].
        }
4

2 に答える 2

2

ここに記述されているサービスは、ServiceBehavior.ReleaseServiceInstanceOnTransactionComplete属性のデフォルト値である を使用しますtrue

これは、トランザクション スコープを適用するメソッドTransactionScopeRequiredによってサービス インスタンスが解放され、次にメソッドが呼び出されたときに、目的の .xml にもかかわらず新しいインスタンスが作成されることを意味しますInstanceContextMode

関連する属性をに変更falseすると、問題が解決するはずです。

于 2012-04-26T20:44:10.680 に答える
0

クライアントがサービスを呼び出すたびに作成されたサービスの新しいインスタンスのように見えます。クライアントがセッション(およびコンストラクター)を終了したことが原因である可能性があります。たとえば、クライアントがプロキシを閉じた場合、この場合、次回クライアントがサービスを呼び出したときに、新しいセッションが作成されます。サービスに接続するたびにプロキシを閉じていないことを確認しましたか?

于 2012-04-26T18:09:14.597 に答える