Iis 7 Identity.Name在IIS7 Asp.NET MVC应用程序线程中释放
我制作了最小的演示项目来说明我的问题。您可以下载源代码 Visual Studio 2008、.NET 3.5、IIS7、Windows 7终极32位。IIS网站仅配置为在集成创建的管道应用程序池(DefaultAppPool)中进行Windows身份验证 问题出在这里。我有一个Asp.NETMVC2应用程序。在一个动作中,我启动一个线程。视图返回 线程正在执行它的任务。。。但它需要访问Thread.CurrentPrincipal.Identity.Name 砰 IIS7的工作进程停止。我有一扇窗户,上面写着: “Visual Studio实时调试器 w3wp.exe[5524]中发生未经处理的异常('System.Object.DisposedException')” 我使用调试器进行了检查,Thread.CurrentPrincipal.Identity有效,但已释放Name属性 如果我在操作返回视图之前等待了很长时间,那么线程可以完成它的工作,并且不会释放Identity.Name。因此,我认为当返回视图时,名称会被释放 为了便于讨论,以下是线程运行的代码(但您也可以下载演示项目。链接位于本文顶部): 所以。。。我做错了什么Iis 7 Identity.Name在IIS7 Asp.NET MVC应用程序线程中释放,iis-7,asp.net-mvc-2,multithreading,Iis 7,Asp.net Mvc 2,Multithreading,我制作了最小的演示项目来说明我的问题。您可以下载源代码 Visual Studio 2008、.NET 3.5、IIS7、Windows 7终极32位。IIS网站仅配置为在集成创建的管道应用程序池(DefaultAppPool)中进行Windows身份验证 问题出在这里。我有一个Asp.NETMVC2应用程序。在一个动作中,我启动一个线程。视图返回 线程正在执行它的任务。。。但它需要访问Thread.CurrentPrincipal.Identity.Name 砰 IIS7的工作进程停止。我有一
谢谢如果您启动一个新线程,它将不会使用相同的HttpContext(它将在另一个上下文上运行) 您可以做的是将HttpContext.Current传递给该方法。 你为什么要通过“这个” 看看这里。。。 您的DoWork将接收一个对象(即您的HttpContext.Current) 此外,要等待3秒钟,您始终可以执行以下操作: 线程。睡眠(3000);-毫秒 这比你在那里做的更好。。。更少的代码,对吗?:)
private void Run()
{
const int SECTOWAIT = 3;
//wait SECTOWAIT seconds
long end = DateTime.Now.Ticks + (TimeSpan.TicksPerSecond * SECTOWAIT);
while (DateTime.Now.Ticks <= end)
continue;
//Check the currentprincipal. BANG!!!!!!!!!!!!!
var userName = Thread.CurrentPrincipal.Identity.Name;
}
public void Start()
{
Thread thread = new Thread(new ParameterizedThreadStart(ThreadProc));
thread.SetApartmentState(ApartmentState.MTA);
thread.Name = "TestThread";
thread.Start(this);
}
static void ThreadProc(object o)
{
try
{
Builder builder = (Builder)o;
builder.Run();
}
catch (Exception ex)
{
throw;
}
}