我正在使用 ASP.Net Web API 2 / .Net 4.5.2。
我试图在对后台工作项进行排队时保留调用主体。为此,我正在努力:
Thread.CurrentPrincipal = callingPrincipal;
但是当我这样做时,我得到一个 ObjectDisposeException:
System.ObjectDisposeException:安全句柄已关闭
如何将当前主体保留在后台工作项中?
我可以以某种方式复印校长吗?
public void Run<T>(Action<T> action)
{
_logger.Debug("Queueing background work item");
var callingPrincipal = Thread.CurrentPrincipal;
HostingEnvironment.QueueBackgroundWorkItem(token =>
{
try
{
// UNCOMMENT - THROWS EXCEPTION
// Thread.CurrentPrincipal = callingPrincipal;
_logger.Debug("Executing queued background work item");
using (var scope = DependencyResolver.BeginLifetimeScope())
{
var service = scope.Resolve<T>();
action(service);
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
}
finally
{
_logger.Debug("Completed queued background work item");
}
});
}
事实证明ClaimsPrincipal
现在有一个复制构造函数。
var principal = new ClaimsPrincipal(Thread.CurrentPrincipal);
这似乎解决了问题,同时保留了所有身份和声明信息。完整功能如下:
public void Run<T>(Action<T> action)
{
_logger.Debug("Queueing background work item");
var principal = new ClaimsPrincipal(Thread.CurrentPrincipal);
HostingEnvironment.QueueBackgroundWorkItem(token =>
{
try
{
Thread.CurrentPrincipal = principal;
_logger.Debug("Executing queued background work item");
using (var scope = DependencyResolver.BeginLifetimeScope())
{
var service = scope.Resolve<T>();
action(service);
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
}
finally
{
_logger.Debug("Completed queued background work item");
}
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)