2012-07-15 36 views
4

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

(我想這樣做的原因是爲了防止序列化錯誤從存在的,如果主要對象類型的組件在其他領域使用。)

編輯: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 
} 
+0

如果任何人試圖解決一個不起眼像這樣的問題:我可以通過啓動一個線程並將線程內的Thread.CurrentPrincipal設置爲所需的主體來獲得所需的內容。然後我可以在該線程中調用''''AppDomain.DoCallBack''來獲得所需的結果。 – tuespetre 2014-06-03 12:58:11

回答

5

你沒有運行的異步方法,目標函數是由同一個線程的應用程序域副執行。所以校長不會改變。這工作:

 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);