Проверка состояния внешней системы при запуске приложения

Мы разрабатываем веб-приложение ASP.NET MVC, которое для некоторых своих данных зависит от другой системы. (Преимущества этого выбора выходят за рамки этого вопроса)

Когда наше веб-приложение запускается, оно нам нужно, чтобы проверить состояние другой системы. Мы делаем это, войдя в него с помощью запроса HTTPCLient.

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

Проблема, с которой я столкнулся, заключается в том, что пользователь не перенаправлен на страницу с ошибкой, а на страницу входа в приложение.

Вот мой Глобальный ASAX.

 private bool _externalSystemAvailable;

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AutomapperConfiguration.Configure();


        _externalSystemAvailable = ExternalSystem.Login();

    }

protected void Application_BeginRequest(object source, EventArgs e)
    {
        var app = (HttpApplication) source;

        var ctx = app.Context;

        FirstRequestInitialisation.Initialise(ctx, _externalSystemAvailable);
    }

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

public class FirstRequestInitialisation
{
    private static bool _alreadyInitialized = false;
    private static object _lock = new object();

    public static void Initialise(HttpContext context, bool _xternalSystemAvailable)
    {
        if (_alreadyInitialized)
        {
            return;
        }

        lock (_lock)
        {
            if (_alreadyInitialized)
            {
                return;

            }
        }

        if ( !externalSystemAvailable)
        {
            HttpContext.Current.RewritePath("/Home/Error");
        }

        _alreadyInitialized = true;
    }
}

HttpContext.Current.RewritePath("/Home/Error");ударил, но пользователь не перенаправлен.

2 ответа

Вы можете перенаправить пользователя в Application_BeginRequest

protected void Application_BeginRequest(object source, EventArgs e)
{
    if (!externalSystemAvailable)
    {
        Response.Redirect("/Home/Error", false);
        Response.StatusCode = 301;
    } 
}

Но есть проблема с приведенным выше кодом, и это путем вызова Response.Redirect Вы создаете новый запрос страницы, что означает, что событие запускается снова и снова и снова и попадает в бесконечный цикл.

Я думаю, что лучшее место для этого - Session_Start:

protected void Session_Start(object source, EventArgs e)
{
    if (Session.IsNewSession && !externalSystemAvailable)
    {
        Response.Redirect("/Home/Error", false);
        Response.StatusCode = 301;
    } 
}

Глупая ошибка с моей стороны. Домашний контроллер был ограничен для аутентифицированных пользователей.

Другие вопросы по тегам