ASP.NET доступ запрещен в отдельной теме - PullRequest
0 голосов
/ 20 сентября 2011
// test.ashx
public class test : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        try
        {
            File.WriteAllText(@"D:\inetpub\site.net\www\gs\data\test.txt", "Test");
            Thread t = new Thread(write);
            t.Start();
            context.Response.Write("OK");
        }
        catch (Exception ex) 
        {
            context.Response.Write(ex.Message);
        }
    }

    private void write()
    {
        try
        {
           File.WriteAllText(@"D:\inetpub\site.net\www\gs\data\test2.txt", "Test2");
        }
        catch (Exception ex)
        {
            LogManager.Instance.Write(ex.Message);
        }
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

У меня есть простой файл Ashx, который записывает два текстовых файла на диск сервера. Одно написано напрямую, а другое написано в отдельном потоке.

Проблема в том, что метод File.WriteAllText, который выполняется в отдельном потоке, вызывает исключение «Отказано в доступе». Другими словами, «test.txt» написано, но «test2.txt» вызывает исключение «Отказано в доступе».

Есть ли способ дать потоку права на чтение / запись основного потока сеанса?

1 Ответ

0 голосов
/ 02 декабря 2011

Поток, который выполняет ваш запрос ASP.NET, является одним из потоков ввода-вывода или одним из workerThreads в рабочем процессе ASP.NET (aspnet_wp.exe). Все эти темы являются многопотоковыми (MTA). Если вы программно олицетворяете учетную запись в своем коде .aspx или .asmx, или если вы олицетворяете с помощью в Web.config или Machine.config, маркер олицетворения сохраняется в этом потоке MTA. Если затем выполнить вызов в однопоточный или многопоточный COM-компонент, доступ к этому компоненту будет осуществляться совершенно другим потоком, который является единственным потоком в его однопоточной квартире (STA). Поскольку этот поток STA не имеет собственного токена олицетворения, и токен олицетворения потока MTA не передается потоку STA, поток STA затем выполняется под идентификатором процесса.

Чтобы решить эту проблему, посмотрите здесь: http://support.microsoft.com/kb/325791#top

...