2014-09-05 437 views
0

我已經構建了一個基於給定ID檢索文件的Web應用程序。如果服務器爲無效ID引發異常,這是否會停止服務器? (我已經在我的本地主機上試過了,服務器在拋出exceptoin後似乎沒有問題,但我仍然不確定,因爲瀏覽器甚至在我停止在Visual Studio中的服務器之後呈現頁面。)Web服務器應該爲無效請求拋出異常嗎?

我是這樣做是因爲我想有一種方法來告訴客戶端應用程序,如果可以檢索文件,它通過格式爲主機名/ get/id的http GET訪問我的Web應用程序。服務器爲一個有效的ID返回一個FilePathResult(在C#中)。對於無效的ID,是否有比拋出異常更好的方法?

謝謝!

+0

有一個方法檢查客戶端ID後返回一個布爾值,然後重定向到一個解釋結果的差異頁面。 – OneFineDay 2014-09-05 03:53:04

+0

當用戶嘗試通過輸入fileID下載文件時,我確實在網頁上向用戶顯示錯誤。但現在我正在處理另一個試圖代表用戶下載文件的程序(我爲該程序提供了一個url模式)。正在拋出一個適當的異常? – totoro 2014-09-05 04:15:14

回答

0

通常,您的代碼引發的異常將導致HTTP 500響應。根據服務器配置的不同,結果可能是標準錯誤頁面或擴展錯誤報告,其中包含有關例外情況的詳細信息 - 堆棧跟蹤等。通常,您不希望最終用戶看到這些信息。

對於MVC應用程序,有兩種基本方法可以處理這類代碼中的報告失敗。

首先,您可以用適當的HTTP響應代碼拋出HttpResponseException

if (!System.IO.File.Exists(filename)) 
    throw new HttpResponseException(HttpStatusCode.NotFound); 

的另一種選擇是你的控制器方法的返回類型更改爲ActionResult,失敗時返回不同類型的結果。當你想回到一個完整的重定向,錯誤視圖等

public ActionResult DownloadFile(string fname) 
{ 
    string filepath = HostingEnvironment.MapPath("~/App_Data/" + fname); 
    if (!System.IO.File.Exists(filepath)) 
     return new RedirectResult("~/Some/Error/Page"); 
    return new FilePathResult(filepath, "text/plain"); 
} 

當然,這只是一個巨大的簡化例如,這是有用的。基本上使用ActionResult作爲返回類型意味着您可以返回該類的任何衍生產品,包括您的FilePathResultViewResult(例如,從View方法)或其他任何衍生產品。

+0

感謝您的解釋!你認爲在程序訪問時拋出HttpResponseException是一個很好的做法,同時爲人類重定向? – totoro 2014-09-05 05:50:19

+0

我個人不喜歡使用它,但是MVC框架被設置爲接受這些異常作爲有效輸出。我猜想這是一種風格選擇。 – Corey 2014-09-06 09:21:40

0

拋出異常不會停止Web服務器。

相關問題