我正在从jQuery AJAX调用WebAPI控制器,以请求通过REST API删除项目。
WebAPI控制器返回204(无内容)响应,然后调用第二个请求(GET)。对于此示例,我希望两个请求都将收到204(无内容)响应。
在Chrome中查看时,两个响应都被完全识别。
但是,Firefox如果不包含任何内容,似乎无法应对204。
要同时获取Chrome(上图)和Firefox(下图)屏幕快照,将从两个浏览器中向WebAPI控制器发送相同的请求。下面的屏幕截图显示Firefox仅能识别前204个响应。
对这两个请求的响应创建方式不同:
第一个回复使用...
return Request.CreateResponse(HttpStatusCode.NoContent);
...返回一个HttpResponseMessage
的实例。
第二个响应使用...
return new NoContentResult();
...我们已将其定义为IHttpActionResult
的实现...
public class NoContentResult : IHttpActionResult
{
private readonly HttpRequestMessage _request;
public NoContentResult(HttpRequestMessage request)
{
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = _request.CreateResponse(HttpStatusCode.NoContent, new StringContent("{}"));
return Task.FromResult(response);
}
}
倒数第四行的new StringContent("{}")
是一种尝试提供一些内容来帮助Firefox的尝试。我也尝试过new StringContent("null")
,但结果相同。
此外,如果在Firefox中检查了第二个响应,则会发现以下错误消息:
SyntaxError:JSON.parse:第1行第1列的数据意外结束 JSON数据
似乎Firefox试图解析有问题的204,但显然没有尝试解析第一个204响应。
此外,请求类型(“删除”与“获取”)似乎并不重要:如果我从第一次调用中以IHttpActionResult
的身份返回204,那么Firefox仍然不喜欢它。
Firefox也将第一个响应显示为包含168个字节,第二个响应显示为包含0个字节,即使它很高兴地显示标题(如下所示)。 Firefox显然对某些事情感到沮丧。
谁能解释为什么Firefox在作为IHttpActionResult
的实现交付时却出现204响应的问题,而不是为什么当作为HttpResponseMessage
的交付而出现问题?
[第一个请求返回一个HttpResponseMessage
而第二个请求返回一个IHttpActionResult
的原因是第一个方法已经存在很长时间了,而第二个方法才是现在被添加。而且由于IHttpActionResult
更易于测试,我们想使用它。]