2011-11-21 117 views
0

全部, 我在Web服務器的Web根目錄上有一個〜/ temp目錄。假設: C:\ inetpub \ myapp \ temp.NET Web服務器上的文件系統訪問權限

我在後面的代碼背後的代碼中刪除所有文件的方法。一切運作良好。

protected CleanTemp() { 
    // clean all the files in tmp dir 
    Array.Foreach... 
} 

的問題是,如果我創造我Global.aspx一個計時器,試圖以同樣的方式來執行這種清潔,系統列出了文件的臨時目錄,但他們每個人,它返回一個異常他說,用戶沒有適當的訪問權限:

[Global.aspx]

void Application_Start(object sender, EventArgs e) { 
    PhisicalTmpFolder = Server.MapPath(~/temp); 

    // create new timer 
    System.Timers.Timer timScheduledTask = new System.Timers.Timer(); 
    timScheduledTask.Interval = 20 * 60 * 1000.0; 
    timScheduledTask.Enabled = true; 
    timScheduledTask.Elapsed += new System.Timers.ElapsedEventHandler(timScheduledTask_Elapsed); 
} 


void timScheduledTask_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { 
    // clean all the files in tmp dir 
    Array.ForEach(
      Directory.GetFiles(PhisicalTmpFolder), 
      delegate(string path) { 
       try { 
        File.Delete(path); i++; 
       } catch (Exception ex) { 
        if (_logger != null) _logger.Error(ex.Message, ex); 
       } 
      } 
     ); 
} 

我怎麼能告訴它必須與應用程序相同的訪問權限運行計時器?

謝謝你在前進, Gianpiero

+0

因此,如果您從Global.asax調用CleanTemp,它可以工作嗎?如果從一個定時器調用它只是不起作用? –

+0

你的目錄是隱藏的嗎?如果不是,則刪除可能會觸發應用程序的重新啓動。 – TomTom

+0

我剛剛在global.asax中測試(沒有定時器),我收到了同樣的錯誤。所以這不是定時器的問題,但它是用戶運行global.asax的問題​​。請記住我是託管的,我無法修改網絡服務器上的任何用戶。無論如何通過FTP目錄是可見的777(rwxrwxrwx) –

回答

2

我覺得你這裏的問題是,ASP.NET進程帳戶不具有相應的權限和你有用戶模擬啓用,所以當期間開始操作頁面請求在具有權限的請求用戶帳戶下完成。

嘗試將ASP.NET進程帳戶權限授予該目錄。

+0

我想你明白了。但我無法修改訪問權限(我託管)。有沒有辦法給global.asax我的web應用程序的相同訪問權限? –

0

檢查應用程序池(通常爲NETWORK SERVICE)中配置的用戶是否有權刪除它們。

1

您可以在timScheduledTask_Elapsed方法中使用模擬來更改爲具有必要的提升權限的身份嗎?

有一篇出色的文章here,描述瞭如何在try/finally區塊中輕鬆創建模擬上下文。

+0

神奇的它的作品! –