C# 如何在asp.net web api中返回json错误消息?

C# 如何在asp.net web api中返回json错误消息?,c#,json,asp.net-web-api,json.net,C#,Json,Asp.net Web Api,Json.net,我想返回一条json errormessage,但目前在fiddler中,我无法在json面板中看到: string error = "An error just happened"; JsonResult jsonResult = new JsonResult { Data = error, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; response = Request.CreateResponse(Http

我想返回一条json errormessage,但目前在fiddler中,我无法在json面板中看到:

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

如何做到这一点?

JsonResult是一个MVC概念。它在Web API中不起作用。显式返回json内容的一种方法是使用我在这个答案中创建的类

如果您所要做的只是返回一个包含简单错误消息的错误响应,那么WebAPI将为此提供一个
CreateErrorResponse
方法。因此,您可以简单地执行以下操作:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
                                   "An error just happened");
这将导致以下HTTP响应(为简洁起见,省略了其他标头):

如果您想返回一个自定义对象,那么可以像以前一样使用
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,而不管客户端要求什么。

您可以通过response属性直接设置当前HTTP响应的状态代码

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

您可以像下面这样返回JSON

 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);
您还可以查看有关最佳实践的链接,尤其是@Daniel Little的答案非常有用

我知道这个答案后来又加了一个,但也许有人对我有好处。

Add config.Formatters.Remove(config.Formatters.XmlFormatter)
WebApiConfig文件中的行

This:new System.Net.Http.Headers.MediaTypeHeaderValue(“应用程序/json”)。谢谢。我一直在寻找的那一块。这不适合我。我得到。。“无法从“”转换为'string'@IanWarburton似乎您使用的是Request.CreateErrorResponse而不是Request.CreateResponse方法。对于'Content',返回的消息不是json格式。
 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);
 return Content(HttpStatusCode.InternalServerError, response);