Post 发布/重定向/获取时重新加载WebKit映像

Post 发布/重定向/获取时重新加载WebKit映像,post,redirect,webkit,get,Post,Redirect,Webkit,Get,我们刚刚重新设计了一个web应用程序,因此我们注意到Chrome中有一个bug(但它可能会影响所有WebKit浏览器),在Post/Redirect/Get之后会重新加载完整的image/js/css。我们的应用程序是使用ASP.NET构建的,并且使用了大量响应。重定向意味着用户将经常遇到此问题。有一个关于测试用例问题的错误报告: 我们尝试了以下方法来解决此问题: 将所有响应.重定向更改为JavaScript重定向。这并不理想,因为在页面转换过程中会出现“白色闪光”,而不是重新加载图像 我们为

我们刚刚重新设计了一个web应用程序,因此我们注意到Chrome中有一个bug(但它可能会影响所有WebKit浏览器),在Post/Redirect/Get之后会重新加载完整的image/js/css。我们的应用程序是使用ASP.NET构建的,并且使用了大量响应。重定向意味着用户将经常遇到此问题。有一个关于测试用例问题的错误报告:

我们尝试了以下方法来解决此问题:

  • 将所有响应.重定向更改为JavaScript重定向。这并不理想,因为在页面转换过程中会出现“白色闪光”,而不是重新加载图像
  • 我们为图像、CSS和JS文件编写了自己的HTTP处理程序。我们将其设置为处理程序发送的最大年龄为1小时。当客户端再次请求该文件时,处理程序将检查浏览器发送的If-Modified-Since标头,以查看该文件自上次下载以来是否已更新。如果日期匹配,处理程序将返回内容长度为0的HTTP 302(未修改)。我们运行了一个测试,如果图像是第一次下载的(HTTP 200),则会有10秒的延迟。所以第一次加载页面时,速度非常慢。如果处理程序返回302(未修改),则没有延迟。我们注意到,即使服务器返回302(未修改),Chrome仍会“重新加载”图像。它没有从服务器中提取文件(如果是,则会导致10秒的延迟),但它正在闪烁/重新加载图像。所以Chrome似乎忽略了302,仍然从缓存中重新加载图像,导致“重新加载”
我们已经检查了一些大型网站,看看他们是否以某种方式修复了它,但是像NewEgg和Amazon这样的网站也受到了影响

有人找到解决办法了吗?还是一种最小化影响的方法

谢谢。

这是一个bug。到目前为止,我看到的唯一“解决方法”是使用刷新头而不是位置头来执行重定向。这远非理想


另外,这个问题是“.”的重复。

我自己在一个使用 重定向(url,false)在许多页面上跟踪帖子

通过阅读HTTP/1.1规范,听起来303响应代码对于实现请求:POST,响应:重定向行为是正确的。不幸的是,更改状态代码并不能使浏览器缓存在Chrome中工作

通过为非静态内容创建自定义模块,我实现了上述文章中描述的解决方法。我还从302中删除了响应内容,以避免出现“objectmovedthere”的闪烁。这可能只与刷新头相关。欢迎评论

public class WebKitHTTPHeaderFixModule : IHttpModule 
{ 
    public void Init(HttpApplication httpApp) 
    { 
        // Attach application event handlers. 
        httpApp.PreSendRequestHeaders += new EventHandler(httpApp_PreSendRequestHeaders);
    }

    void httpApp_PreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        if (context.Response.StatusCode == 302)
        {
            context.Response.ClearContent();

            // If Request is POST and Response is 302 and browser is Webkit use a refresh header
            if (context.Request.HttpMethod.Equals("POST", StringComparison.OrdinalIgnoreCase) && context.Request.Headers["User-Agent"].ToLower().Contains("webkit"))
            {
                string location = context.Response.Headers["Location"];
                context.Response.StatusCode = 200;
                context.Response.AppendHeader("Refresh", "0; url=" + location);
            }
        }
    }

    public void Dispose() 
    {} 
}
注意:我认为这不适用于非重载版本的Response.Redirect,因为它调用Response.End()