从跨应用程序域传播防止Thread.CurrentPrincipal中(Preventing Thr

2019-09-19 12:10发布

有没有人,如果有可能,从传播在一个应用程序域边界停止当前线程的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
}

Answer 1:

你没有运行的异步方法,目标函数是在二级应用程序域由同一个线程执行。 所以本金不会改变。 这工作:

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


Answer 2:

这似乎做你想要什么:

System.Threading.ExecutionContext

具体而言,看看该SuppressFlow方法。

克里斯



文章来源: Preventing Thread.CurrentPrincipal from propagating across application domains
标签: c# .net clr