如何在OnApplicationStarted期间发生错误时重定向用户?

时间:2013-03-01 16:43:52

标签: c# asp.net asp.net-mvc

我在Global.asax中的OnApplicationStarted方法期间进行系统版本比较,如果数据库版本和系统版本不匹配,则不允许系统启动。

所以它看起来像这样:

protected override void OnApplicationStarted()
{
  try{
     if(systemVersion != dbVersion)
        throw new Exception("They are not same!");
  }
  catch{
    //do some other things
    //Response.Redirect("~/VersionError.html");
  }
}

但它说"在此上下文中无法使用响应。" 我试图捕获Application_Error中的错误,但我收到了同样的错误。

我的问题是如何从这些方法中将用户重定向到错误页面?

修改

我知道目前没有响应但是我问的是如何解决这个问题。而且我在OnApplicationStarted之后可以点击方法的原因之一就是我们不会这样做。如果发生此异常,我想加载很多东西。

3 个答案:

答案 0 :(得分:0)

此时您没有回复申请开始!这是应用程序启动时而不是在做出响应时。

如果通过设置将捕获所有请求的默认路由满足此条件,您可以在此处设置内容以将每个URL定向到错误页面。这将为您提供所需的功能,因为将来的请求会获得错误页面。

答案 1 :(得分:0)

你能抛出一个HTTP错误:

throw new HttpException(403, "Forbidden");

然后在你的web.config中:

  <customErrors mode="On">
    <error statusCode="403" redirect="~/VersionError.html"/>
  </customErrors>

答案 2 :(得分:0)

由于您在应用程序启动时无法访问Response,但是如果满足条件,则希望所有传入请求都转到错误页面,您需要在管道中设置更远的内容。想想IIS模块。通过以下方式安装模块:

<system.webServer>
  <modules>
    <add name="VersionsNotSameHandler" 
         type="Company.Exceptions.VersionsNotSameHandler, Company.Exceptions" 
         preCondition="managedHandler" />
  </modules>
</system.webServer>

现在输入模块代码:

namespace Company.Exceptions
{
  public class VersionsNotSameHandler: IHttpModule
  {
    public void Dispose() { }

    public void Init(HttpApplication application)
    {
        context.PreRequestHandlerExecute += newEventHandler(OnPreRequestHandlerExecute) 
    }

    public void OnPreRequestHandlerExecute(Object source, EventArgs e){

        HttpApplication app = (HttpApplication)source; 
        HttpRequest request = app.Context.Request;
    // Check for invalid versioning
        app.Response.Redirect('.html page displaying error', true);
    }
  }
}

OnPreRequest发生在每个请求之前,确保始终检查版本...如果您发现事情变慢,可能需要缓存。