ASP.NET Access在单独的Thread中被拒绝

时间:2011-09-20 17:44:02

标签: asp.net multithreading ashx

// 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 :(得分:0)

执行ASP.NET请求的线程是其中一个I / O线程或ASP.NET辅助进程(aspnet_wp.exe)中的一个workerThreads。这些线程都是多线程公寓(MTA)线程。如果以编程方式模拟.aspx或.asmx代码中的帐户,或者通过在Web.config或Machine.config中使用模拟,则模拟令牌将保留在此MTA线程上。如果您随后调用单线程或单元线程COM组件,则该组件将由完全不同的线程访问,该线程是其单线程单元(STA)中的单线程。由于此STA线程没有自己的模拟令牌,并且MTA线程的模拟令牌未传递给STA线程,因此STA线程将在进程标识下执行。

为了解决这个问题,请看一下: http://support.microsoft.com/kb/325791#top