在应用程序启动时检查外部系统的状态

时间:2014-09-22 11:20:48

标签: c# .net asp.net-mvc asp.net-mvc-4 global-asax

我们正在开发一个ASP.NET MVC Web应用程序,该应用程序依赖于另一个系统的某些数据。 (这个选择的优点超出了这个问题的范围)

当我们的Web应用程序启动时,我们需要它来检查其他系统的状态。我们通过使用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");,但未重定向用户。

2 个答案:

答案 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;
    } 
}

答案 1 :(得分:0)

我这个愚蠢的错误。家庭控制器仅限于经过身份验证的用户。