2014-03-24 74 views
22

我想返回一個JSON errormessage的,但在小提琴手的那一刻,我不能看到這在JSON面板:如何在asp.net web api中返回json錯誤消息?

string error = "An error just happened"; 
JsonResult jsonResult = new JsonResult 
{ 
    Data = error, 
    JsonRequestBehavior = JsonRequestBehavior.AllowGet 
}; 
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data); 

如何做到這一點?

回答

53

的幾點:

如果所有你希望做的是返回包含一個簡單的錯誤消息,網絡錯誤響應API爲此提供了一個CreateErrorResponse方法。因此,你可以簡單地做:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
            "An error just happened"); 

這將導致以下HTTP響應(略去了其他頭):

HTTP/1.1 400 Bad Request 
Content-Type: application/json; charset=utf-8 
Content-Length: 36 

{"Message":"An error just happened"} 

如果你想返回自定義對象,而不是,那麼你用Request.CreateResponse像你這樣做,但不要使用MVC JsonResult。相反,只需直接通過你的對象CreateResponse

var myError = new 
{ 
    Data = "An error just happened", 
    OtherDetails = "foo bar baz" 
}; 

return Request.CreateResponse(HttpStatusCode.BadRequest, myError); 

現在,說你這樣做,但你沒有得到JSON從服務器返回。認識到Web API通常使用內容類型協商來確定發送響應時使用的格式非常重要。這意味着,它會查看客戶端發送的Accept標頭的請求。例如,如果Accept標題包含application/xml,則Web API將返回XML。如果標題包含application/json那麼它將返回JSON。所以,你應該檢查你的客戶端是否發送了正確的Accept標題。這就是說,有很多方法可以強制Web API總是以特定的格式返回數據,如果這是你真正想要的。您可以通過使用CreateResponse不同的過載也規定了內容類型在方法層面做到這一點:

return Request.CreateResponse(HttpStatusCode.BadRequest, myError, 
    new System.Net.Http.Headers.MediaTypeHeaderValue("application/json")); 

或者,您可以從配置完全在您的WebApiConfig文件中刪除XML格式:

config.Formatters.Remove(config.Formatters.XmlFormatter); 

這將強制Web API始終使用JSON,而不管客戶端要求什麼。

+1

這個新System.Net.Http.Headers.MediaTypeHeaderValue( 「應用/ JSON」)。非常感謝。我正在尋找的確切缺失的一塊。 –

+3

這不適合我。我得到..「不能轉換‘<匿名類型:字符串錯誤>’到‘字符串’」 –

-3

您可以直接通過Response屬性設置當前HTTP響應的狀態碼

Response.StatusCod = (int)HttpStatusCode.BadRequest; 
return Json(HttpStatusCode.BadRequest); 
+0

哪裏是錯誤響應模式? – arslanaybars

0

,你可以像下面返回JSON,

return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response); 

我建議你的方法的返回類型使用IHttpActionResult而不是HttpResponseMessage,如果你的api的方法返回類型是IHttpActionResult。你可以返回像;

return Content(HttpStatusCode.InternalServerError, response); 

您還可以查看error returning特別@Daniel小的回答最好做法,鏈接真的有用。

我知道答案最近添加了,但也許能替代別人。