3

WCF サービスが参照するライブラリの 1 つは、ThreadStatic 変数を使用します。サービス メソッドは、各呼び出しの開始時にその値を設定します。これが安全かどうか疑問に思っています。つまり、呼び出し全体で 1 つのスレッドだけが排他的に使用されることを保証できますか? または、呼び出しが 1 つのワーカー スレッドで開始され、別のワーカー スレッドで終了する可能性はありますか? または、ワーカー スレッドを別のメソッド呼び出しにスワップしてから、再び元に戻すことはできますか?

ConcurrencyMode.Single と InstanceContextMode.PerSession のデフォルトを使用しています。

編集

これまでに見つけた唯一の情報は、次のブログ投稿です。このブログ投稿では、呼び出しが複数のスレッドによって処理される可能性があると述べています。

http://blogs.microsoft.co.il/blogs/applisec/archive/2009/11/23/wcf-thread-affinity-and-synchronization.aspx

この人は正しいですか?マイクロソフトからの決定的な情報はありますか?

4

4 に答える 4

3

いつでも CallContext クラスを使用できるかわからない場合: CallContext.LogicalSetData CallContext.LogicalGetData

スレッドが変更された場合、ThreadStatic は機能しませんが、独自の新しいスレッド/タスクを作成したとしても、Logical CallContext は .NET で渡されます。

于 2012-11-15T22:49:29.437 に答える
2

あなたが話している現象は、単一のリクエストが複数のリクエスト間で受け渡される可能性があるため、「スレッドアジリティ」と呼ばれます。

簡単に言えば、いいえ、特定のリクエストが単一のスレッドによって処理されることを保証することはできません。

ここで受け入れられた回答を参照してください: WCF リクエストはスレッド アジャイルを処理していますか?

*これは、IIS からホストされている WCF の場合です。

于 2012-11-12T09:20:32.067 に答える
0

保存に問題があります。負荷テストを開始し、GetRolesForUser のテストを開始したことを調査するには、次のようにします。

public override bool IsUserInRole(string username, string roleName)
    {
        object stub = new object();
        bool res;
        lock(stub)
        {
            RoleProviderCount++;
            ThreadId = Thread.CurrentThread.ManagedThreadId;
            res = GetRolesForUser(username).Contains(roleName);
        }
        return res;
    }

これは私のログです:

Timestamp: 06.11.2012 13:55:03 Message:  ServiceCalls count 1; RoleProvider count 1 Thread Id 9 
Timestamp: 06.11.2012 14:00:22 Message:  ServiceCalls count 1; RoleProvider count 1 Thread Id 9 
Timestamp: 07.11.2012 5:30:38 Message:  ServiceCalls count 1; RoleProvider count 1 Thread Id 11 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:58 Message:  ServiceCalls count 1; RoleProvider count 4 Thread Id 27 
Timestamp: 07.11.2012 5:31:59 Message:  ServiceCalls count 1; RoleProvider count 5 Thread Id 22 
Timestamp: 07.11.2012 5:31:59 Message:  ServiceCalls count 1; RoleProvider count 8 Thread Id 26 
Timestamp: 07.11.2012 5:31:59 Message:  ServiceCalls count 1; RoleProvider count 8 Thread Id 26 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 10 Thread Id 23 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 11 Thread Id 29 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 12 Thread Id 22 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 13 Thread Id 27 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 14 Thread Id 24 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 15 Thread Id 30 
Timestamp: 07.11.2012 5:32:00 Message:  ServiceCalls count 1; RoleProvider count 16 Thread Id 26 
Timestamp: 07.11.2012 5:32:01 Message:  ServiceCalls count 1; RoleProvider count 17 Thread Id 11
Timestamp: 07.11.2012 5:32:01 Message:  ServiceCalls count 1; RoleProvider count 18 Thread Id 23
Timestamp: 07.11.2012 5:32:01 Message:  ServiceCalls count 1; RoleProvider count 20 Thread Id 26
Timestamp: 07.11.2012 5:32:01 Message:  ServiceCalls count 1; RoleProvider count 20 Thread Id 26
Timestamp: 07.11.2012 5:32:01 Message:  ServiceCalls count 1; RoleProvider count 21 Thread Id 24

したがって、 RoleProvider メソッドは同じスレッドから呼び出されました。(WCF サービス構成インスタンス モード PerCall、同時実行数 Multiple)

于 2012-11-07T06:10:28.700 に答える
0

以下は、私の同僚の 1 人からの回答です。


あなたが言及した「この男」は間違っているに違いありません。実際のサービス メソッドの実行中にスレッドを変更する方法はありません。これはどのメソッドにも当てはまり、WCF とは関係ありません。

別のメソッド/スレッドで完了する非同期呼び出しを作成することができます。しかし、それは特別なことではありません: http://tao.qshine.com/note/ThreadIssue.html

もちろん、このスレッドの敏捷性が実際にメソッド呼び出しがスレッドを切り替えることに関連しているかどうかについて非常に興味があります...ここではマネージド スレッドについて話しているので、Microsoft がスレッド ID を変更する理由はありません。CallContext は、非同期呼び出しを実行する場合に状態を保存できるように、Microsoft が提供する機能です。

インスタンス コンテキストが、メソッドを実行するのとは異なるスレッドを使用してサービスをインスタンス化する可能性がありますが、PerCall を使用する場合、これは発生しません。本当にセッションを使用していますか? そうでない場合は、PerCall に切り替える必要があります。同じセッション内の異なる呼び出しが異なるスレッドを使用する可能性があります。


理にかなっているようです。コメントはありますか?

于 2012-11-14T05:59:35.343 に答える