You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:09:05