2016-09-06 81 views
0

我在ASP.NET Core中玩了一下。我正在創建一個基本的webapi。 我想在出現問題時顯示JSON錯誤。ASP.Net核心錯誤JSON

打印屏幕顯示我想在屏幕上顯示的內容。 唯一的問題是,它與200

PrintScreen

catch (NullReferenceException e) 
{ 
    return Json(NotFound(e.Message)); 
} 

一個的StatusCode送我可以這樣解決這個問題:

return NotFound(new JsonResult(e.Message) {StatusCode = 404); 

但我不喜歡這個,因爲現在您可以使用NotFound指定狀態碼500。

有人能讓我走向正確的方向嗎?

真誠, 布萊希特

+0

第二段代碼是正確的做法。你「可以」指定一個500作爲狀態碼,但你爲什麼要控制api? –

+0

您不必在'JsonResult'上設置'StatusCode'。 NotFound方法已經在做這件事。 –

回答

1

你就不能像return NotFound(e.Message);

或者你可能有自己的錯誤文檔格式,去return NotFound(new ErrorDocument(e.message));

如果你有一個JsonResult返回再去做類似如下的事:

return new JsonResult(YourObject) { StatusCode = (int)HttpStatusCode.NotFound }; 

現在你已經完全控制了ol的響應格式和你的狀態碼。如果需要,您甚至可以連接串行器設置。 :)

+0

如果我返回NotFound(e.Message);那麼錯誤信息顯示爲純文本,因爲e.Message是普通的'字符串'。我檢查ModelState的其他錯誤是使用JSON。它喜歡有一致性。 我現在已經創建併爲錯誤而創建類。我會分開發布我的新解決方案。感謝您向我展示道路。我正忙於使用NotFound()。它完全忘了僅僅使用'new JsonResult'作爲返回 – ErazerBrecht

+1

我理解模型狀態檢查。如果你想更好地掌握這一點,我建議你使用一個關於[這裏]描述的異常過濾器(https://docs.asp.net/en/latest/fundamentals/error-handling.html#server -異常處理)。 然後,所有你必須擔心的是拋出一個適當的異常,你的控制器會看起來不錯,如果沒有圍繞主代碼的全局try-catch塊。只是一個想法。 是的,錯誤一致性是一件好事。 :) –

+0

感謝您發佈該鏈接。我會檢查出來的! 祝您有美好的一天! – ErazerBrecht

1

EDIT: Found a much better solution here on stackoverflow.

謝謝Swagata Prateek提醒我只使用一個return new JsonResult()。我確實通過這種方式解決了我的問題。

public class Error 
{ 
    public string Message { get; } 
    public int StatusCode { get; } 

    public Error(string message, HttpStatusCode statusCode) 
    { 
     Message = message; 
     StatusCode = (int)statusCode; 
    } 
}  


[HttpGet("{id}")] 
public IActionResult Get(int id) 
{ 
    try 
    { 
     return Ok(_manager.GetPokemon(id)); 
    } 
    catch (NullReferenceException e) 
    { 
     var error = new Error(e.Message, HttpStatusCode.NotFound); 
     return new JsonResult(error) {StatusCode = error.StatusCode}; 
    } 
}