【问题标题】:ASP.NET Access Denied in separate ThreadASP.NET 访问在单独的线程中被拒绝
【发布时间】:2011-11-21 07:26:29
【问题描述】:
// 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”导致访问被拒绝异常。

有没有办法赋予线程主 Session 线程的读/写权限?

【问题讨论】:

  • 我不认为问题出在代码上。尝试在 c temp 上写入,并为该文件夹中的每个人提供写入权限。我想问题出在 ntfs 或 iis 权限上。
  • 我的应用程序在我的托管公司的服务器上,我无权更改权限或输出目录
  • 也许磁盘上的权限没有传播到另一个线程?您的模拟/身份设置是什么样的?另外,你想做什么? :)
  • 我想是这样,但我不知道为什么会发生这种行为。我不做任何自定义模拟编码(所有代码都在上面)。

标签: asp.net multithreading ashx


【解决方案1】:

执行 ASP.NET 请求的线程是 I/O 线程之一或 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

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    相关资源
    最近更新 更多