Пользовательское промежуточное ПО заставляет перестать работать страницу сервера Blazor - PullRequest
4 голосов
/ 19 октября 2019

Кажется, что мое пользовательское промежуточное ПО вызывает конфликт с моей страницей на сервере. Пример промежуточного программного обеспечения вкратце проверяет состояние bool и, если true, перенаправляет на страницу счетчика, предоставленную шаблоном блэйзера «из коробки». Без промежуточного программного обеспечения, вставленного в конвейер, страница счетчика прекрасно работает, когда вы нажимаете кнопку, но как только промежуточное программное обеспечение помещается в конвейер, кнопка больше не работает, так как не увеличивает счетчик. Я поместил пользовательское промежуточное программное обеспечение прямо перед промежуточным программным обеспечением app. UseEndpoints, хотя кажется, что не имеет значения, где оно находится, поскольку оно не работает, независимо от того, в каком порядке оно находится. Почему мое пользовательское промежуточное программное обеспечение нарушает работу сервера Blazor? со стороны работает нормально?

middleware:

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");
    });

}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я подозреваю, что здесь происходит следующее:

  • Браузер переходит на URL-адрес приложения и пытается согласовать соединение SignalR.
  • SignalR возвращает протокол и токен для использования для успешного подключенияна концентратор (с использованием "/_blazor?id=token_value").

К сожалению, пользовательское промежуточное ПО перенаправляет каждый запрос, поэтому оно останавливает приложение от первоначального подключения к концентратору (вызывая кучу ошибок консоли) - хотя мне удалось успешно перенаправить на "/counter". Но поскольку промежуточное ПО останавливает соединение SignalR, оно разрывает соединение клиента с сервером, что необходимо для приложений Blazor Server.

Я бы предложил перенести эту проверку из промежуточного ПО. Вы можете попробовать создать службу, которая может вернуться, если приложение находится в режиме обслуживания, добавить вызов службы к компоненту Index.razor, а затем, при необходимости, отобразить компонент «Режим обслуживания».

0 голосов
/ 21 октября 2019

В вашем коде URL-адрес согласования Blazor также перенаправлен, поэтому согласование не будет работать.

Попробуйте использовать приведенные ниже коды, избегающие этого:

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