0

.NET 4.0、ASP.NET、および WCF を使用しています。これは多層 Web サービスです。発信者 ID を Web 層に記録し、データ層でデータベースにクエリを実行するときにその ID を使用したいと考えています。

問題は、アプリが Web 層とデータ層の間でマルチスレッド (.NET タスク ライブラリ経由で実装) のビジネス レイヤーを使用することです。メソッドがたくさんあるので、呼び出し元 ID をパラメーターとしてビジネス層の各関数に渡してから、データ層の各関数に渡すことは避けたいと思います。

「呼び出し」コンテキストで値を永続化する方法はありますか? HttpContext と OperationContext が頭に浮かびますが、私の知る限りでは、スレッドが切り替わったときに状態を保持しません。

ありがとう

4

3 に答える 3

0

デフォルトの ASP.NET 認証を使用すると、ID を取得できるはずです。

HttpContext.Current.User.Identity

ただし、BL または DAL に認識させるのHttpContextは最善のアイデアではありません。カスタム UI コードを一般的な BL および DA レイヤーに埋め込みたくありません。通常のフローでは、UI でユーザーを作成し (に基づいてHttpContext)、ユーザーはいくつかのメソッドとプロパティを持っています (BL にあります)。1 つのプロパティは ID で、メソッドはこの ID を使用できます。一部の人々は、ロジックを個別のサービスに分離することを好みます。これらのサービスは、操作に必要なすべての情報を取り込む必要があります。サービスはユーザーまたはユーザー ID のいずれかを取得します (必要な場合)。

このようにアプリケーションを設計すると、マルチスレッド アプリケーションは正常に動作します。各スレッドには、ユーザーのローカル コピーがあります。コンテキスト スイッチはスレッドが必要とするすべてのデータをロードし、共有リソースがなく、各スレッドが独自のユーザーを持ちます。

于 2012-09-17T23:00:55.530 に答える
0

認証を使用している場合は、Oleskii からの回答を参照してください。

認証を使用せず、セッションを追跡するだけの場合

HttpSessionState.SessionID プロパティ

すべてのスレッドに同じ値が表示されると思います。

于 2012-09-17T23:20:49.483 に答える
0

HttpContext と OperationContext はスレッドごとに異なるという点で正しいです (これらは Thread Local Storage を使用しているためです)。

しかし、私が見る解決策は簡単です。制御する静的クラスを使用するだけで、そのクラスには値ルックアップ用のパブリックにアクセス可能な辞書が含まれます。

于 2012-09-17T22:43:47.710 に答える