2016-05-11 3 views
0

私のWCFコードでは、ユーザーのIDと名前は静的変数に格納されています。これは、HttpContext.Current.User.Identity.Nameおよびデータベースヒットから取得されます。また、接続文字列を格納するための他の静的変数等は、ファイルに関連するものを記録し、あるWCFのInstanceContextMode.PerCallはすべての静的変数/メソッドをインスタンス化しますか?

最近、私は最初の呼び出しがまだ処理されたとき、私のクライアントから2番目の呼び出しは、ユーザー名を設定する競合状態に自分自身を発見しました。これにより、第2コールによって更新された第1コール・リーディング・ユーザ・データが得られた。これを避けるために

、私はInstanceContextMode.PerCallについて読み、それは静的変数は、すべての呼び出しに対して非静的のように振る舞いますか。

私の質問は

1です)私はInstanceContextMode.PerCallを使用している場合は、それはそれはすべての静的変数やメソッドをインスタンス化します意味ですか?私はこれを使用してすべての通話に対して新しいユーザーデータを取得する予定です。しかし、私はこれが接続文字列静的変数、ログファイル、およびその他の静的変数の新しいインスタンスを作成することも想定しています。これは正しいです?それはパフォーマンスに影響しますか(web.configなどから再度読む)?

2)InstanceContextMode.PerCallを使用するが、静的変数に関連する接続文字列をのみ関連するユーザデータのための静的変数をインスタンスを作成して残すために方法はありますか?

3)呼び出しが行われた後の静的変数を離れて配置することが必須IDisposeを実装Disposeメソッド()ですか?

+0

通常の静的変数は、AppDomainごとに1回初期化され、すべてのスレッド間で共有されます。つまり、ユーザーごとの情報を静的変数に保存することはできません(すでに分かっているように)。InstanceContextMode.PerCallは何も変更しません。 – Evk

答えて

0

静的変数にすべてのデータがある理由はまずありませんか?それは悪いデザインのように見えます。 InstanceContextMode.PerCallと言うとき。私の理解では、すべてのコールにはデータのコピーがあり、コールごとに一意です。

あなたのデータではなくstatic readonlyとしてそれらを宣言しようとし、その後変更されていないことにしたい場合。最後に、より良いデザインを選択する必要があります。

+0

これは既存のコードです。私はデザインしませんでした。このコードは、global.asaxのsession_start中にHttpContextからユーザー情報を取得します。 WCFリクエストのヘッダー(カスタムコード)からユーザー情報を読み込むことがあります。彼らは別のcsprojにいます。あなたは静的変数を取り除くために何を提案しますか?行の下にパラメータとして渡すと、コードが大きく変更されます。だからこそ私はInstanceContextMode.PerCall – Jeevan

関連する問題