有没有人,如果有可能从传播过应用程序域边界停止当前线程的IPrincipal的?我有超过已分配给该线程的IPrincipal无法控制,但我确实有过创建应用程序域控制。
(我想这样做的原因是为了prevent从存在的,如果主要对象类型的组件在其他域不可用的序列化错误。)
编辑: ExecutionContext.Sup pressFlow 看起来很有希望,但它似乎并没有实现这一目标。下面打印MyIdentity:
静态无效的主要() { ExecutionContext.Sup pressFlow(); = Thread.CurrentPrincipal中新的GenericPrincipal(新GenericIdentity(MyIdentity),角色.Split()); 。AppDomain.CreateDomain(新域)DoCallBack(独立); } 静态无效的隔离() { Console.WriteLine(现任校长:+ Thread.CurrentPrincipal.Identity.Name); // MyIdentity }解决方案
您没有运行一个异步方法,目标函数是由同一个线程二级AppDomain中执行。这样主体不发生变化。这工作:
VAR流量= ExecutionContext.Sup pressFlow(); = Thread.CurrentPrincipal中新的GenericPrincipal(新GenericIdentity(MyIdentity),角色.Split()); ThreadPool.QueueUserWorkItem((X)=> { 。AppDomain.CreateDomain(新域)DoCallBack(独立); }); flow.Undo();
或者,如果你只是想运行一个特定的背景下,同一个线程,那么你可以使用ExecutionContext.Run():
VAR副本= ExecutionContext.Capture(); = Thread.CurrentPrincipal中新的GenericPrincipal(新GenericIdentity(MyIdentity),角色.Split()); ExecutionContext.Run(副本,新ContextCallback((X)=> { 。AppDomain.CreateDomain(新域)DoCallBack(独立); }), 空值);Does anyone if it's possible to stop the current thread's IPrincipal from propagating over an application domain boundary? I have no control over the IPrincipal that's assigned to the thread, but I do have control over creating the application domains.
(The reason I want to do this is to prevent a serialization error from occuring if the principal object type's assembly is unavailable in the other domain.)
Edit: ExecutionContext.SuppressFlow looks promising, but it doesn't appear to achieve the goal. The following prints "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 }解决方案
You didn't run an asynchronous method, the target function is executed in the secondary appdomain by the same thread. So the principal doesn't change. This works:
var flow = ExecutionContext.SuppressFlow(); Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("MyIdentity"), "Role".Split()); ThreadPool.QueueUserWorkItem((x) => { AppDomain.CreateDomain("New domain").DoCallBack(Isolated); }); flow.Undo();Or if you just want to run the same thread with a specific context then you can use 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);
更多推荐
来自全国各地的应用领域传播preventing Thread.CurrentPrincipal中
发布评论