有人可以阻止当前线程的 IPrincipal 在应用程序域边界上传播吗?我无法控制分配给线程的 IPrincipal,但我可以控制创建应用程序域。
(我想要这样做的原因是为了防止在主要对象类型程序集在其他域中不可用时发生序列化错误。)
Edit: 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)