Identity.Name располагается в потоке приложения IIS7 Asp.NET MVC. - PullRequest
0 голосов
/ 15 июня 2010

Я сделал самый маленький демонстрационный проект, чтобы проиллюстрировать мою проблему. Вы можете скачать исходники Здесь

Visual Studio 2008, .NET 3.5, IIS7, Windows 7 Ultimate, 32 бита. Веб-сайт IIS настроен ТОЛЬКО для проверки подлинности Windows в объединенном пуле приложений конвейера (DefaultAppPool).

Вот проблема. У меня есть приложение Asp.NET MVC 2. В действии я запускаю тему. Представление возвращается.

Поток выполняет свою работу ... но ему необходим доступ к Thread.CurrentPrincipal.Identity.Name

BANG

Рабочий процесс IIS7 останавливается. У меня есть окно, которое говорит: Visual Studio отладчик Just-In-Time Необработанное исключение («System.Object.DisposedException») возникло в w3wp.exe [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 Ответ

1 голос
/ 22 июня 2010

Если вы запустите новый поток, он не будет использовать тот же HttpContext (он будет работать в другом контексте).

Что вы можете сделать, это передать HttpContext.Current этому методу. Почему вы передаете «это»?

Взгляните сюда ... http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

Ваш DoWork получит объект (который будет вашим HttpContext.Current)

Также, чтобы подождать 3 секунды, вы всегда можете сделать

Thread.Sleep (3000); - миллисекунды.

Это лучше, чем у вас есть цикл while ... Меньше кода, верно? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...