4

如果可以阻止当前线程的 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
}
4

2 回答 2

5

您没有运行异步方法,目标函数由同一线程在辅助 appdomain 中执行。所以校长不变。这有效:

        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);
于 2012-07-15T15:53:08.850 回答
2

这似乎可以满足您的要求:

System.Threading.ExecutionContext

具体来说,看一下 SuppressFlow 方法。

克里斯

于 2012-07-15T05:58:01.537 回答