ASP.NET Core 5 Web API自定义404响应丢失<script>标签如何解决?
问题成因
- 多余的
await next()调用:你在已经写入自定义404响应内容后,又执行了一次后续中间件的逻辑,后续中间件(比如静态文件中间件、默认状态码处理中间件)会修改已经生成的响应内容,要么截断内容要么覆盖部分HTML结构,导致位于页面后半段的script标签被删除。 - 未清空原有响应内容:触发404时,ASP.NET Core默认已经生成了一部分默认404响应内容,你直接往Body流里追加自定义HTML,会导致两份内容拼接后HTML结构异常,浏览器解析时会自动过滤掉不符合DOM结构的script标签。
- 响应未标记处理完成:你没有明确告知后续中间件当前响应已经处理完毕,也没有设置正确的
ContentLength,响应传输过程中可能出现内容截断,刚好丢失了末尾的script标签部分。
解决方法
方案1:修复现有自定义中间件
直接修改你写的中间件逻辑,删掉多余的next()调用,写入前清空原有响应:
app.Use(async (context, next) => { await next(); // 仅在响应未开始发送、状态码为404时处理 if (context.Response.StatusCode == 404 && !context.Response.HasStarted) { // 清空默认404响应的所有内容和头信息 context.Response.Clear(); var page = HttpFailedTemplates.NotFoundPage(context.Request.Path, context.TraceIdentifier, DateTime.Now.ToString(), "نیل سافت", "https://localhost:44313/"); context.Response.ContentType = "text/html"; var buffer = Encoding.UTF8.GetBytes(page); // 明确设置响应长度,避免截断 context.Response.ContentLength = buffer.Length; await context.Response.Body.WriteAsync(buffer, 0, buffer.Length); // 删除多余的await next(),终止后续中间件处理当前响应 } });
方案2:使用内置中间件(更稳定)
ASP.NET Core提供了专门的状态码处理中间件UseStatusCodePages,无需自己处理中间件执行顺序和流操作:
app.UseStatusCodePages(async context => { if (context.HttpContext.Response.StatusCode == 404) { var page = HttpFailedTemplates.NotFoundPage( context.HttpContext.Request.Path, context.HttpContext.TraceIdentifier, DateTime.Now.ToString(), "نیل سافت", "https://localhost:44313/"); context.HttpContext.Response.ContentType = "text/html"; await context.HttpContext.Response.WriteAsync(page); } });
内容的提问来源于stack exchange,提问作者thisisnabi
相关产品推荐
相关产品推荐

