簡體   English   中英

防止Thread.CurrentPrincipal跨應用程序域傳播

[英]Preventing Thread.CurrentPrincipal from propagating across application domains

有沒有人可以阻止當前線程的IPrincipal在應用程序域邊界上傳播? 我無法控制分配給該線程的IPrincipal,但我確實可以控制創建應用程序域。

(我想這樣做的原因是為了防止在主體對象類型的程序集在其他域中不可用時發生序列化錯誤。)

編輯: ExecutionContext.SuppressFlow看起來很有希望,但它似乎沒有實現目標。 以下打印“MyIdentity”:

static void Main ()
{
    ExecutionContext.SuppressFlow ();
    Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity ("MyIdentity"), "Role".Split ());
    AppDomain.CreateDomain ("New domain").DoCallBack (Isolated);
}

static void Isolated ()
{
    Console.WriteLine ("Current principal: " + Thread.CurrentPrincipal.Identity.Name);  // MyIdentity
}

您沒有運行異步方法,目標函數由同一個線程在輔助appdomain中執行。 因此校長不會改變。 這有效:

        var flow = ExecutionContext.SuppressFlow();
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MyIdentity"), "Role".Split());
        ThreadPool.QueueUserWorkItem((x) => {
            AppDomain.CreateDomain("New domain").DoCallBack(Isolated);
        });
        flow.Undo();

或者,如果您只想運行具有特定上下文的相同線程,則可以使用ExecutionContext.Run():

        var copy = ExecutionContext.Capture();
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MyIdentity"), "Role".Split());
        ExecutionContext.Run(copy, new ContextCallback((x) => {
            AppDomain.CreateDomain("New domain").DoCallBack(Isolated);
        }), null);

這似乎做你想要的:

System.Threading.ExecutionContext

具體來說,看看SuppressFlow方法。

克里斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM