StaticPage icon indicating copy to clipboard operation
StaticPage copied to clipboard

首次访问Status显示:(failed) net::ERR_HTTP2_PROTOCOL_ERROR, 页面也没有正常展示

Open dean-shanghai opened this issue 1 year ago • 4 comments

首次访问Status显示:(failed) net::ERR_HTTP2_PROTOCOL_ERROR, 页面也没有正常展示,如图:

首次访问异常

dean-shanghai avatar Sep 14 '24 05:09 dean-shanghai

ERR_HTTP2_PROTOCOL_ERROR 是一个Chrome浏览器中的错误,表明浏览器在使用HTTP/2协议时遇到了协议违规的情况。这可能是由于服务器发送了不符合HTTP/2标准的响应导致的。

toolgood avatar Sep 16 '24 00:09 toolgood

我更新到.net 8,没有重现这个问题

toolgood avatar Sep 16 '24 00:09 toolgood

报错情况只在首次访问页面时出现(首次访问页面:html文件夹中还没有生成该页面的.html/.gzip/.br等缓存文件)。

报错信息:System.InvalidOperationException: Headers are read-only, response has already started.

fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] An unhandled exception has occurred while executing the request. System.InvalidOperationException: Headers are read-only, response has already started. at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowHeadersReadOnlyException() at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value) at Microsoft.AspNetCore.Mvc.HtmlStaticFileAttribute.OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) in C:...\Attributes\HtmlStaticFileAttribute.cs:line

报错的位置是这一句:context.HttpContext.Response.Headers["Cache-Control"] = "max-age=" + (CurrPageExpireMinutes ?? ExpireMinutes) * 60;

dean-shanghai avatar Sep 16 '24 03:09 dean-shanghai

修改好了,添加了一个判断

                if (context.HttpContext.Response.Headers.IsReadOnly == false) {
                    var fi = new FileInfo(filePath);
                    var etag = fi.LastWriteTimeUtc.Ticks.ToString();
                    context.HttpContext.Response.Headers["Cache-Control"] = "max-age=" + (CurrPageExpireMinutes ?? ExpireMinutes) * 60;
                    context.HttpContext.Response.Headers["Etag"] = etag;
                    context.HttpContext.Response.Headers["Date"] = DateTime.Now.ToString("r");
                    context.HttpContext.Response.Headers["Expires"] = DateTime.Now.AddMinutes(CurrPageExpireMinutes ?? ExpireMinutes).ToString("r");
                }

toolgood avatar Sep 25 '24 05:09 toolgood