Identity.Name位于IIS7 Asp.NET MVC应用程序线程中

时间:2010-06-15 16:15:42

标签: iis-7 asp.net-mvc-2 multithreading

我制作了最小的演示项目来说明我的问题。您可以下载来源Here

Visual Studio 2008,.NET 3.5,IIS7,Windows 7旗舰版32位。 IIS网站在Integolved管道应用程序池(DefaultAppPool)中配置为用于Windows身份验证。

这是问题所在。我有一个Asp.NET MVC 2应用程序。在一个动作中,我开始一个线程。视图返回。

线程正在做它的工作......但它需要访问Thread.CurrentPrincipal.Identity.Name

BANG

IIS7的工作进程停止。我有一个窗口说: “Visual Studio即时调试器  w3wp.exe中出现未处理的异常('System.Object.DisposedException')[5524]“

我使用调试器检查并且Thread.CurrentPrincipal.Identity有效,但是Name属性被释放。

如果我在返回视图之前在操作中等待很长时间,那么Thread可以完成它的工作并且不会处理Identity.Name。所以我认为在返回视图时会丢弃名称。

为了讨论起见,这里是线程运行的代码(但你也可以下载演示项目。链接在这篇文章的顶部):

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

那么......我做错了什么?

由于

1 个答案:

答案 0 :(得分:1)

如果你开始一个新线程,它将不会使用相同的HttpContext(它将在另一个上下文中运行)。

您可以做的是将HttpContext.Current传递给该方法。 你为什么要传递“这个”?

看看这里...... http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

您的DoWork将收到一个对象(将是您的HttpContext.Current)

此外,要等待3秒,您始终可以执行

Thread.sleep代码(3000); - 毫秒。

这比你在那里循环更好...更少的代码,对吗? :)