Проверка состояния внешней системы при запуске приложения
Мы разрабатываем веб-приложение 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;
}
}
Глупая ошибка с моей стороны. Домашний контроллер был ограничен для аутентифицированных пользователей.