2011-09-20 46 views
0
// 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文件,它將兩個文本文件寫入服務器磁盤。一個是直接寫的,另一個是寫在一個單獨的線程中。ASP.NET訪問在單獨的線程中被拒絕

問題是,在獨立線程中執行的方法File.WriteAllText會導致Access Denied異常。換句話說,「test.txt」被寫入,但「test2.txt」導致訪問被拒絕異常。

有沒有辦法給一個線程主要會話線程的讀/寫權限?

+1

我不認爲問題是與代碼。嘗試在c temp上寫入,並給該文件夾上的每個人寫入權限。我想這個問題是在ntfs或iis權限。 –

+0

我的應用程序位於我的託管公司的服務器上,並且我沒有任何有關更改權限或輸出目錄的權限 –

+0

也許磁盤上的權限不會傳播到其他線程?你的模擬/身份設置是什麼樣的?另外,你想要做什麼? :) – bzlm

回答

1

執行ASP.NET請求的線程是ASP.NET工作進程(aspnet_wp.exe)中的一個I/O線程或workerThreads之一。這些線程都是多線程公寓(MTA)線程。如果以編程方式在您的.aspx或.asmx代碼中模擬一個帳戶,或者如果您在Web.config或Machine.config中使用模擬,則模擬令牌將保留在此MTA線程中。如果您然後調用單線程或公寓線程的COM組件,那麼該組件將由完全不同的線程訪問,該線程是其單線程單元(STA)中的單線程。由於此STA線程本身沒有模擬標記,並且MTA線程的模擬標記未傳遞給STA線程,因此STA線程將以進程標識執行。

爲了解決這個問題,看看這裏: http://support.microsoft.com/kb/325791#top