Я сам столкнулся с этой проблемой на сайте веб-форм ASP.NET, который использует
Response.Redirect (url, false) после сообщения на многих из его страниц.
Из прочтения спецификации HTTP / 1.1 кажется, что код ответа 303 будет правильным для реализации поведения Request: POST, Response: Redirect. К сожалению, изменение кода состояния не позволяет кешированию браузера работать в Chrome.
Я реализовал обходной путь, описанный в посте выше, создав специальный модуль для нестатического контента. Я также удаляю содержимое ответа из 302-х, чтобы избежать появления моргания «объект перемещен сюда». Это, вероятно, относится только к заголовкам обновления. Комментарии приветствуются!
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 ().