2010-09-09 58 views
2

我無法在新的FileSystemWatcher事件上使用Response.Redirect(或Response.Write)。在FileSystemWatcher事件上的ASP.net Response.Redirect

protected void Page_Load(object sender, EventArgs e) 
{ 
    RunFolderListener(); 
} 

private void RunFolderListener() 
{ 
     FileSystemWatcher fsw = new FileSystemWatcher(); 
     fsw.Path = Server.MapPath("~/uploaded_images/"); 
     fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | 
          NotifyFilters.DirectoryName | NotifyFilters.FileName; 
     fsw.Changed += new FileSystemEventHandler(OnChanged); 
     fsw.EnableRaisingEvents = true; 
} 

    private void OnChanged(object source, FileSystemEventArgs e) 
    { 
     Response.Redirect(....); //not working 
     Response.Write (....);//not working 

    } 
+0

是你的onChanged方法嗎? – MUG4N 2010-09-09 08:13:56

+0

是的。它被稱爲。 – Ranch 2010-09-09 08:23:00

回答

0

恐怕不是去上班 - 你的文件夾觀察家事件不是頁面生命週期的一部分 - 你通常會有一些其他的線程或任務運行處理FSW,然後在某個地方堅持你的國家。然後,你可以說

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (myState.FileIngested) { 
     Response.Redirect(....); 
     Response.End(); 
    } 
} 

希望幫助

4

你想要什麼是不可能的。 FileSystemWatcher事件由與頁面線程不同的線程處理。爲了說明這一點:

Page thread: |-Page_Load----...----Page_Unload-| 
       |-Start FSW 
FSW thread :  |-----------------------------...--------FSW.OnChanged(...)---| 

內某處的Page_LoadFileSystemWatcher開始。頁面生命週期以Page_UnLoad結尾,並且運行頁面生命週期的線程返回到線程池。更重要的是,頁面呈現並完成,沒有什麼可以改變。

在稍後的某個時刻,也許一秒鐘,也許十分鐘,FileSystemWatcher會生成一個事件。該頁面很久以前由瀏覽器呈現,因此當您撥打Response.Redirect時,您認爲應該發生什麼?由於響應已發送至瀏覽器,因此不會發生任何事情。

此外,這最終會造成內存問題。每次請求該頁面時,都會創建一個新的FileSystemWatcher。觀察者必須保持對頁面的引用,因爲它必須在發生事件時調用事件處理程序。因此頁面和觀察者都不能被垃圾收集。所以每次你請求這個頁面時,你都會實例化一個頁面和一個觀察者,這個頁面佔用了一些永不回收的內存。

+0

其實我試圖創建這個機制(FSW)爲了趕上Flash事件: 用戶點擊我的頁面上的Flash按鈕上傳文件。 上傳文件時,會調用一個aspx頁面(圖像通過表單提交給此頁面發送)。 我無法在該頁面上使用重定向,因此我嘗試使用FSW代替。 由於我無法修改Flash - 我需要另一種解決方案來更改Flash事件的頁面位置。 – Ranch 2010-09-10 10:21:05

+0

我不確定我明白爲什麼你不能在你發佈圖片的aspx頁面上使用重定向。 – 2010-09-10 11:40:34

+0

圖像提交到的頁面不是包含Flash對象的頁面。 – Ranch 2010-09-10 13:27:32

1

正如對方提到的那樣,你所要做的是不可能的。但是,您可以通過以下方式創建類似效果:

  1. 在Global.asax的Application_Start事件中創建一個新的FileSystemWatcher。
  2. 對於FileSystemWatcher的OnChange事件,有它更新緩存變量(即緩存[「UploadedImagesChanged」]包含你所需要的信息(即LastChangeDateTime)的對象。
  3. 在您的ASPX頁面,添加一個隱藏的價值持有(即HiddenField_LastUpdated.Value = DateTime.Now.ToString())
  4. 在您的Page_Load中,將當前HiddenField_LastUpdated與Cache [「UploadedImagesChanged」] LastChangeDateTime進行比較。如果緩存日期較新,Response.Redirect用戶。

你也可以考慮在頁面中添加一個asp:Timer,如果您希望該頁面輪詢服務器以檢查更新,請使用更新面板。

+0

FileSystemWatcher只會在PageLoad之後創建一個事件,因爲它是啓動文件上傳的頁面本身(使用其中的Flash對象,請參閱我對Ronald Wildenberg的評論), 因此PageLoad將永遠不會捕獲此事件。另一方面,使用asp:Timer(我從來沒有遇到過)可能是一個解決方案(不是最優雅的 - 但我認爲它應該可以工作)。 – Ranch 2010-09-10 10:30:05

+0

我試圖使用asp:Timer可能是一個解決方案。問題是導致Flash對象重新加載每個滴答聲,使其無法使用。 – Ranch 2010-09-12 10:08:56

+0

如果將Timer放置在自己的UpdatePanel中,它不應該影響頁面上的Flash對象。另外,確保頁面上的任何其他UpdatePanel被設置爲有條件地更新。給那一槍。 – Jemes 2010-09-12 14:58:31