ASP.NET Razor Pages - Условное перенаправление

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

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

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

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

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


person Antoine C.    schedule 09.12.2018    source источник


Ответы (2)


Этого можно добиться с помощью простого пользовательского Компонент промежуточного программного обеспечения, который позволит выполнять необходимую логику еще до того, как попадет в конвейер 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, если есть другое промежуточное программное обеспечение, которого вы бы хотели избежать в случае нахождения в режиме обслуживания.

person Kirk Larkin    schedule 09.12.2018

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

person orellabac    schedule 09.12.2018