3

私は最近、JSON形式の結果を返す比較的単純なWCFRESTサービスの開発を開始しました。最初はすべてがうまく機能し、サービスはすぐに稼働しました。

このサービスの主な機能は、データベースから抽出された大量のデータを返すことです。このデータはめったに変更されないので、処理を高速化するためにキャッシュメカニズムを設定してみることにしました。これを行うために、InstanceContextMode.SingleとConcurrencyMode.Multipleを設定し、いくつかのスレッドロックを使用して、静的にキャッシュされた結果を安全に返すことを計画しました。5分ごと、またはIISがすべてをクリアすることを決定したときはいつでも、データはデータベースから再フェッチされます。

私の問題はInstanceContextMode.Singleが期待どおりに動作しないことです。私の理解では、WCFサービスクラスの単一のインスタンスを作成して維持する必要があります。ただし、私が持っている動作は、呼び出しごとに作成されるクラスの完全に新しいインスタンスです。これには、すべての静的変数の再初期化が含まれます。

WebサービスをwebHttpBinding(RESTに使用)からwsHttpBindingに変更し、サービスをSOAP構成として使用しようとしましたが、これはまったく同じ動作になります。

私は何が間違っているのですか!!! これを理解しようとしてあまりにも長い時間を費やしてきました。

どんな助けでも素晴らしいでしょう!

4

1 に答える 1

0

奇妙なことに、これを試してみて、何が起こるか教えてもらえますか?

ServiceThrottlingBehavior ThrottleBehavior = new ServiceThrottlingBehavior();
ThrottleBehavior.MaxConcurrentSessions = 1;
ThrottleBehavior.MaxConcurrentCalls = 1;
ThrottleBehavior.MaxConcurrentInstances = 1;

ServiceHost Host = ...
Host.Description.Behaviors.Add(ThrottleBehavior);

また、[どのようにして] 単一のサービス インスタンスが「単一」ではないことを確認できますか? プロファイラーから複数のデータベース接続を見ましたか? それが、サービスが単一のインスタンスではない理由を示唆していたのですか? サービス操作の実装から、別のスレッドでいくつかの作業を行っていますか?

于 2013-12-24T20:53:54.590 に答える