我从 jQuery AJAX 调用 WebAPI 控制器来请求通过 REST API 删除项目。
WebAPI 控制器返回 204(无内容)响应,然后调用第二个请求 (GET)。对于此示例,我希望两个请求都收到 204(无内容)响应。
在 Chrome 中查看时,两个响应都被完全识别。
但是,如果 204 不包含任何内容,Firefox 似乎无法处理。
为了获得 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("{}")
4 行试图提供一些内容来帮助 Firefox。我也尝试new StringContent("null")
过同样的结果。
此外,如果在 Firefox 中检查第二个响应,则会发现以下错误消息:
SyntaxError: JSON.parse: JSON 数据的第 1 行第 1 列的数据意外结束
Firefox 似乎正在尝试解析这个有问题的 204,但它显然没有尝试解析第一个 204 响应。
此外,请求类型(DELETE 与 GET)似乎并不重要:如果我IHttpActionResult
从第一次调用中返回 204,那么 Firefox 仍然不喜欢它。
Firefox 还将第一个响应显示为包含 168 个字节,第二个响应显示为包含 0 个字节,尽管它会很高兴地显示标题(如下)。Firefox 显然对某些事情感到不安。
谁能解释为什么 Firefox 在作为实现交付时会出现 204 响应问题,IHttpActionResult
但在交付时不会出现问题HttpResponseMessage
?
[第一个请求返回 anHttpResponseMessage
而第二个返回 an的原因IHttpActionResult
是第一个方法已经存在很长时间了,而第二个方法现在才被添加。由于IHttpActionResult
更容易测试,我们想使用它。]