我有ASP.NET应用程序,其中有一些MVC和WebAPI控制器。 MVC 5.1和WebAPI 2.1。根本没有棘手的配置,唯一的办法就是删除XML格式化程序:
public static class WebApi
{
public static void Configure(HttpConfiguration config)
{
var formatters = config.Formatters;
formatters.Remove(formatters.XmlFormatter);
}
}
有一个简单的DTO可以将控制器操作返回的数据放在一起:
public class TokenResponse
{
public string token { get; set; }
public string token_type { get; set; }
public int expires_in { get; set; }
public string error { get; set; }
}
以下代码:
[NoHttpResponseCaching]
public class TokenController : ApiController
{
public async Task<HttpResponseMessage> PostAsync(HttpRequestMessage request, TokenRequest tokenRequest)
{
try
{
// do some stuff
var response = new TokenResponse { ... };
return request.CreateResponse(HttpStatusCode.OK, response);
}
catch (TokenRequestValidationException ex)
{
_logger.WriteError(ex);
var response = new TokenResponse { error = ex.ErrorToDisplay };
return request.CreateResponse(HttpStatusCode.BadRequest, response);
}
}
}
问题是,如果一切正常,我将TokenResponse序列化为JSON,如预期的那样,但是如果发生异常,执行流程将进入catch块并且响应体等于“Bad Request”,这是来自Fiddler的反应:
HTTP/1.1 400 Bad Request
Cache-Control: no-store
Pragma: no-cache
Content-Type: text/html
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Wed, 18 Jun 2014 08:25:53 GMT
Content-Length: 11
Bad Request
尝试返回具有一些随机命名属性的匿名对象,而不是使用TokenResponse,获得相同的响应:
return request.CreateResponse(HttpStatusCode.BadRequest, new {klhjaoiubf = "kjhaflkjh"});
此时我一直试图理解为什么我没有在响应体中序列化我的对象以及如何更改它。任何人,任何想法,为什么我的对象在响应代码是BadRequest时被忽略?