Я сделал самый маленький демонстрационный проект, чтобы проиллюстрировать мою проблему. Вы можете скачать исходники Здесь
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;
}
}
Так ... что я делаю не так?
Спасибо