繁体   English   中英

自定义中间件导致 Blazor 服务器端页面停止工作

[英]Custom Middleware is causing Blazor Server-side page to stop working

我的自定义中间件似乎与我的 blazor 服务器端页面发生了某种冲突。 简短的示例中间件检查 bool 状态,如果为真,则重定向到开箱即用的 blazor 模板提供的计数器页面。 在没有将中间件插入管道的情况下,当您单击按钮时,计数器页面可以正常工作,但是一旦将中间件放入管道中,按钮就不再起作用,因为它不会增加计数。 我已经将自定义中间件放在 app.UseEndpoints 中间件之前,尽管看起来它放在哪里并不重要,因为无论它的顺序如何它都不起作用。为什么我的自定义中间件会破坏 blazor 服务器- 端页面无法正常运行?

中间件:

class CheckMaintenanceStatusMiddleware
{
    private readonly RequestDelegate _next;
    public CheckMaintenanceStatusMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {


        var statusCheck = true;

        if(statusCheck && context.Request.Path.Value != "/counter")
        {
            context.Response.Redirect("/counter");
        }
        else
        {
            await _next.Invoke(context);
        }
    }

}

public static class CheckMaintenanceStatusMiddlewareExtension
{
    public static IApplicationBuilder UseCheckMaintenanceStatus(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CheckMaintenanceStatusMiddleware>();
    }
}

启动文件中的配置方法:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{


    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles();


    app.UseCookiePolicy();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseCheckMaintenanceStatus();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });

}

使用您的代码, blazor 协商 url 也被重定向,因此协商将不起作用。

尝试以下避免这种情况的代码:

if (statusCheck && context.Request.Path.Value != "/counter"&& !context.Request.Path.Value.StartsWith("/_blazor"))
{
    context.Response.Redirect("/counter");
}
else
{
    await _next.Invoke(context);
}

我怀疑这里发生的事情是

  • 浏览器转到应用程序 URL 并尝试协商 SignalR 连接。
  • SignalR 返回用于成功连接到集线器的协议和令牌(使用"/_blazor?id=token_value" )。

不幸的是,自定义中间件正在重定向每个请求,因此它最终会阻止应用程序与集线器进行初始连接(触发一堆控制台错误) - 尽管我能够成功重定向到"/counter" 但是由于中间件正在停止 SignalR 连接,它会中断从客户端到服务器的连接,这是 Blazor 服务器应用程序所必需的。

我建议将此检查从中间件移开。 您可以尝试创建一个可以在应用程序处于维护模式时返回的服务,向Index.razor组件添加服务调用,然后在必要时呈现“维护模式”组件。

这是旧帖。 但我正在使用 app_offline.htm 页面来停止 blazor 应用程序

我把它放在根目录(内容根文件夹)中,只有普通的 html,上面写着“网站正在维护中”

此页面将终止所有请求和所有 blazor 集线器连接。

然后,当我更新完我的应用程序后,我将此文件重命名为 app_offline2.htm

意思是“app_offline.htm”是一个特殊的文件名,我的框架和核心使用它来确定应用程序是否可以满足任何请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM