ASP.NET Razor Pages - Условное перенаправление - PullRequest
0 голосов
/ 09 декабря 2018

В одной из моих сущностей EF у меня есть логическое поле, которое указывает, идет ли обслуживание или нет.

Таким образом, я хотел бы перенаправить все свои страницы на страницу ошибки 503, только если этоboolean установлен в true.

Я мог бы поместить следующий фрагмент кода на каждую страницу:

if (_context.SystemParameters.First().Maintenance)
    return Redirect("/Error/503");

Но это было бы не так просто.Есть ли лучший способ добиться такого условного перенаправления на всех моих страницах?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Этого можно достичь с помощью простого пользовательского компонента Middleware , который позволит выполнить требуемую логику еще до входа в конвейер MVC.Вот пример реализации:

app.Use(async (ctx, next) =>
{
    var context = ctx.RequestServices.GetRequiredService<YourContext>();

    if (ctx.Request.Path != "/Error/503" && context.SystemParameters.First().Maintenance)
    {
        ctx.Response.Redirect("/Error/503");
        return;
    }

    await next();
});

Здесь ctx - это экземпляр HttpContext, который сначала используется для извлечения экземпляра YourContext из контейнера DI, а затем для выполнения перенаправления.Если Maintenance равен false, next вызывается для передачи выполнения следующему компоненту промежуточного программного обеспечения.

Этот вызов Use будет идти до UseMvc в методе Startup.Configureдля того, чтобы обеспечить возможность короткого замыкания в промежуточном программном обеспечении.Обратите внимание, что этот подход будет применяться к контроллерам / представлениям, а также к Razor Pages - его также можно поместить дальше в метод Configure, если есть другое промежуточное ПО, которого вы бы хотели избежать в случае нахождения в режиме обслуживания.

0 голосов
/ 09 декабря 2018

Я бы порекомендовал использовать PageFilter.Если вы хотите это на всех своих страницах, возможно, внедрите IPageFilter или IAsyncPageFilter и зарегистрируйте его глобально.Я думаю, что вы можете проверить https://www.learnrazorpages.com/razor-pages/filters, если вам нужно больше деталей

...