2

我从 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更容易测试,我们想使用它。]

4

0 回答 0