gpt4 book ai didi

c# - 防止 Thread.CurrentPrincipal 跨应用程序域传播

转载 作者:太空狗 更新时间:2023-10-30 00:43:21 27 4
gpt4 key购买 nike

是否有人可以阻止当前线程的 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);

关于c# - 防止 Thread.CurrentPrincipal 跨应用程序域传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11489673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com