2009-07-26 51 views
0

在Page_Load()部分中,我檢查有效輸入&,因爲它們無效,所以我將請求傳輸到自定義錯誤頁面。無法將請求傳輸到期望的ASP.NET錯誤頁面

雖然這樣做,拋出了一個ThreadAbortException,它被我的catch塊捕獲,但asp.net將請求傳輸到未知的異常頁面。 我在做什麼錯?當我轉移到錯誤頁面時,我不想讓ThreadAbortException異常來。 如:

 protected void Page_Load(object sender, EventArgs e) 
    { 

    try 
    { 
        if (String.IsNullOrEmpty(szProductName)) 
         { 
         //Product name not given. Hence cant process further. 
         Server.Transfer(Constants.ERROR_WRONG_INPUTS_ASPX); 
         } 
        else 
         { 
          //Do something..... 
         } 
    } 
    catch(Exception Ex) 
    { 

    } 

    } 

作爲一種變通方法,我現在使用:

Response.Redirect(Constants.ERROR_WRONG_INPUTS_ASPX, false); 

,而不是Server.Transfer的,即我讓這個進程繼續在這令我需要只檢查有效性&那麼背景執行剩餘的代碼。

我的問題類似於:Exception Handling Application Block Exception Handler running in ASP.NET cannot call Response.End()但它似乎沒有回答。

回答

1

Response.Redirect拋出ThreadAbortException異常中止當前頁面並將控制權轉移到新頁面。添加false參數「固定」這個問題,因爲它告訴Response.Redirect在轉移控制權之前在當前頁面上完成處理。

我相信雖然你需要看看你的應用程序流。由於輸入錯誤而將頁面傳輸到錯誤頁面似乎是處理輸入驗證的過於複雜的方式。我認爲你最好使用顯示消息的回傳,或者在發佈頁面之前在javascript中進行一些驗證。

+0

事情是,用戶將通過鏈接來到我的頁面:http://MyServer/MySite/Details.aspx?ProductName = FireFox。 所以我可以檢查產品是否有效,只有當他的請求來到我的服務器。如果他沒有輸入產品名稱,我需要告訴他他輸入了錯誤的輸入(也是錯誤產品的情況)。 我無法幫助用戶輸入錯誤的產品名稱/無名稱,因爲這是我的手。有什麼建議麼? – 2009-07-26 17:25:15

+0

如果確實是無效的情況,我會拋出一個錯誤並讓應用程序錯誤處理接管。特別是如果錯誤意味着在調用應用程序中存在問題。 或者,如果這不是一個選項,我會返回到調用應用程序識別問題。 – 2009-07-26 21:00:23

0

任何時候調用Response.End()都會發生ThreadAbortException。 Server.Transfer在內部調用Response.End(),因爲它立即結束當前處理,並將請求轉交給新頁面,該頁面負責將信息返回給瀏覽器。

Response.Redirect更加優雅,因爲它完成處理當前請求並向客戶端返回301重定向響應。通常這會導致瀏覽器向服務器發出第二個請求來請求重定向URL。

你說這是轉移到一個未知的錯誤頁面,但我不知道爲什麼。你是否在Global.asax的Application_Error方法中這樣做?如果錯誤得到處理,你應該能夠控制它前往的位置。

+0

它重定向到我在web.config中設置的默認錯誤頁面: 2009-07-26 17:28:33

0

我吸收你擺脫那個嘗試...... catch塊。你期望在那裏發現什麼?如果您確實希望某些特殊情況取決於您的實施情況,那麼可能會在其他區塊內進一步發生。所以你應該試着包裝它......終於在那裏。

ASP.NET在結束請求時拋出ThreadAbortException,但它最終在調用堆棧中捕獲它,因此您不應該捕獲它。如果你期望其他一些可能的狀態腐敗,就讓它傳播到全局異常處理程序;這不是你的代碼拋出。

0

如果產品丟失或產品不在數據存儲區中,那麼您可能需要考慮返回404(Page Not Found)。這表明瀏覽器 - (和谷歌搜索蜘蛛!) - 沒有這樣一個頁面。你打算使用SEO友好的URL: http://MyServer/MySite/Products/FireFox