2014-09-22 9 views
0

Мы разрабатываем веб-приложение 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); 
    } 

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

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"); идет удар, но пользователь не перенаправляется.

ответ

0

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

1

Вы можете перенаправить пользователя в 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; 
    } 
} 
+0

Да, я был вниз по бесконечному пути петли уже :) – MrBliz

+0

вопрос фиксируется сейчас в любом случае – MrBliz