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

.NET Blazor Server返回307状态码触发SignalR报错如何解决?

问题根因

你当前编写的全局中间件会作用于所有流经ASP.NET Core管道的请求,包括Blazor Server强依赖的SignalR /_blazor 端点请求、静态资源请求、内部资源请求等,所有这些请求被强制设置307状态码后,SignalR客户端无法完成正常的握手流程建立长连接,所以会抛出连接状态异常的报错。

可行方案

方案1:修改全局中间件,添加路径过滤

仅对普通用户访问的页面请求设置307状态码,排除Blazor内部请求、静态资源请求即可:

app.Use(async (context, next) =>
{
    var requestPath = context.Request.Path.Value;
    // 过滤规则可根据你的项目实际路径调整
    if (context.Request.Method == HttpMethod.Get.Method
        && !requestPath.StartsWith("/_blazor")
        && !requestPath.StartsWith("/_content")
        && !requestPath.StartsWith("/css")
        && !requestPath.StartsWith("/js")
        && !requestPath.StartsWith("/lib")
        && !requestPath.StartsWith("/favicon.ico"))
    {
        context.Response.StatusCode = 307;
        // 符合307响应规范可按需添加Location头
        // context.Response.Headers.Location = "你的目标跳转地址";
    }
    await next.Invoke();
});

注意该中间件需要放在 app.UseStaticFiles()、Blazor相关中间件注册之前。

方案2:直接在Blazor宿主页面设置状态码(更推荐)

如果你的Blazor Server采用默认的_Host.cshtml作为入口宿主页面,可以直接在该页面的Razor代码块中设置状态码,完全不会影响其他请求:

@{
    Context.Response.StatusCode = 307;
    // 按需添加Location头
    // Context.Response.Headers.Location = "你的目标跳转地址";
}

该方案无需修改全局管道逻辑,适配性更高,不会对SignalR连接、静态资源加载产生任何影响。

注意事项

307临时重定向的HTTP规范要求响应需携带Location头,如果你仅需要返回307状态码同时展示维护落地页、没有实际跳转需求,主流搜索引擎也可正常识别该临时状态,不会影响原官网的SEO权重。

内容的提问来源于stack exchange,提问作者Nick Kisbye Hansen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:06:03