Chrome在网络中显示200 OK状态,即使服务器返回304状态码。

3
我正在构建一个前端和后端应用程序。当使用请求中的 If none match header 时,我的服务器返回 304 状态,但 Chrome 总是显示 200 状态。相同的实现在 Firefox 和 IE 中运行良好。所有标头都被正确放置。我已将缓存控制添加到 max-age 0 并始终重新验证。然而,Chrome 成功显示缓存数据,但为什么我在网络中看不到 304 状态?以下是来自 Chrome 和 Firefox 网络面板的图像。 Chrome 中的图像 Firefox 中的图像 我的后端是使用 .net core 构建的,并且我已使用操作过滤器属性返回 ETag 和 304 状态,以下是代码。
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){ var isRequestMethodGet = context.HttpContext.Request.Method == "GET";
    bool isModified = false;
    string authToken = "";
        var path = context.HttpContext.Request.Path.ToString() + context.HttpContext.Request.QueryString.ToString();
        if (context.HttpContext.Request.Headers.ContainsKey("Authorization"))
        {
            authToken = context.HttpContext.Request.Headers["Authorization"];
        }

        var etag = GetETag(path, authToken);
        if (isRequestMethodGet)
        {
            var myId = context.HttpContext.Request.Headers["myId"].ToString();
            var value = await distributedCacheRepository.GetCachedItem($"{redisPrefix}-{myId}");
            if (value != null)
            {
                if (context.HttpContext.Request.Headers.Keys.Contains("If-None-Match") && context.HttpContext.Request.Headers["If-None-Match"].ToString() == etag)
                {
                    isModified = true;
                    context.HttpContext.Response.StatusCode = 304;
                    context.Result = new StatusCodeResult((int)HttpStatusCode.NotModified);
                }
            }
            else
            {
                await distributedCacheRepository.InsertKeyValueAsync($"{redisPrefix}-{myId}", myId);
            }
        }

        if(!isRequestMethodGet || !isModified)
        {
            await next();
        }

       context.HttpContext.Response.Headers.Add("cache-control", new[] { "no-transform", "must-revalidate", "max-age=0" });
       context.HttpContext.Response.Headers.Add("vary", new[] { "Accept", "Accept-Encoding", "Authorization", "Cookie" });           
       context.HttpContext.Response.Headers.Add("ETag", new[] { etag }); }

@PavelAnikhouski 谢谢您的回复,我已经添加了来自 .net core 的代码,该代码基于 Etag 返回 304 状态。 - amit kumar
如果你和我一样认为这是Chrome的bug,你可以查看https://bugs.chromium.org/p/chromium/issues/detail?id=1269602。 - cube45
1个回答

1

你是否向不同的端口/域名发送请求? 我也遇到了和你一样的问题,服务器返回 304 (通过 postman 检查),但是 Chrome 显示为 200。
这是我找到原因的方法:

  1. 在我的 swagger 文档中,返回 304 (从 localhost:8083 发送请求到 localhost:8083)
  2. 在我的应用程序中,相同的请求但返回 200 (从 localhost:4300 发送请求到 localhost:8083)
  3. 因此,我将应用程序请求代理到相同的域名 (从 localhost:4300 发送请求到 localhost:4300 ,然后代理到 localhost:8083)
  4. 我得到了预期的 304

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接