2013-06-04 30 views
1

我有一個在Content-type頭中使用帶application/json的請求調用的操作。這些請求會自動創建一個試圖反序列化請求內容的JsonValueProvider。當json格式不正確時,值提供程序會拋出一個導致應用程序錯誤頁面的異常。ASP.NET MVC 4:由JsonValueProvider引起的句柄異常

要重現此行爲,只需將POST無效json數據發送到作爲Content-type標頭髮送application/json的操作即可。這將觸發異常。

[編輯]

不需要太多的代碼。只需創建一個空的控制器方法,並使用Firefox「Poster」之類的工具向操作發送無效請求。

public class HomeController 
{ 
    public ActionResult Index() 
    { 
     return this.Json(true); 
    } 
} 

然後用海報:

  • 集內容類型,以application/json
  • 設置請求內容{"This is invalid JSON:,}
  • 將請求發送

的結果將是全標準的ASP.NET HTML錯誤頁面(通用或自定義,取決於您的應用程序)。

[/編輯]

因爲我的動作是由嵌入式設備叫,我想發送的,而不是HTML錯誤頁面的短響應。我希望能夠創建一個狀態碼爲500的響應,內容類型爲:text/plain,以及異常消息爲內容。

我已經嘗試過一個自定義模型聯編程序和一個自定義錯誤處理程序屬性,但既然在處理管道中發生異常,它們都不會被調用。有沒有辦法來處理這個錯誤?

作爲一種解決方法,我目前禁用整個應用程序的JsonValueProvider,並自己從請求正文加載值。如果有一種方法可以在每個操作的基礎上禁用JsonValueProvider,這也會有所幫助。

在此先感謝您的指點!

+0

你能不能從您的代碼後的一些樣品? –

回答

0

您可以訂閱Application_Error事件在Global.asax中和處理異常,只要你想:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var exception = Server.GetLastError(); 
    Response.TrySkipIisCustomErrors = true; 
    Response.Clear(); 
    Server.ClearError(); 
    Response.StatusCode = 500; 
    Response.ContentType = "text/plain"; 
    Response.Write("An error occured while processing your request. Details: " + exception.Message); 
} 
+0

是的,這是一個有效的選項,但不限於特定的操作。該應用程序由一個真實的Web應用程序以及嵌入式設備的API部分組成。一般的例外頁面應該到位。我只希望爲特定的MVC操作定製它。 –

+0

當然,測試異常處理程序中當前的控制器和操作是非常簡單的。一旦你知道你可以只爲這些請求執行異常處理。 –

+0

它真的很瑣碎嗎?在錯誤事件處理程序中,我沒有MVC RouteValues,還是我?我不想讓這個依賴於URL,因爲路由可能會發生變化,而且我不想總是要記住在全局錯誤處理程序中調整模式匹配。 –