有没有人,如果有可能,从传播在一个应用程序域边界停止当前线程的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
}
你没有运行的异步方法,目标函数是在二级应用程序域由同一个线程执行。 所以本金不会改变。 这工作:
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方法。
克里斯
文章来源: Preventing Thread.CurrentPrincipal from propagating across application domains