如何在ASP.NET应用程序中初始化(2)_ASP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:程序员看淘宝,如何用Session保存用户状态
网上购物已经成为现在生活不可缺少的一部分。我们上淘宝只是为了消费,今天换一个角度,用程序员的眼光看看淘宝。 如上图: 情况一:当打开一些和账户有关的网页,检测用户没有登录,系统自动会跳转到登录界面。 情况二:当检测到已经有用户登录,页面会自动跳转到目的

其实就是一个登录页面,后台代码为:

  1. protected void btnLogin_Click(object sender, EventArgs e)  
  2. {  
  3.     bool ok = false;  
  4.  
  5.     using( SqlConnection connection  
  6.         = new SqlConnection(AppInitializer.MyNorthwindConnectionSetting.ConnectionString) ) {  
  7.  
  8.         connection.Open();  
  9.  
  10.         // 其它的数据库操作。  
  11.  
  12.         ok = true;  
  13.     }  
  14.  
  15.     if( ok )  
  16.         Response.Redirect("Default2.aspx");  

你没有想到的Global.asax怪事!

或许有些人会这样写他们的初始化代码:

  1. void Application_Start(object sender, EventArgs e)  
  2. {  
  3.     //在应用程序启动时运行的代码  
  4.     try {  
  5.         AppInitializer.Init();  
  6.     }  
  7.     catch( Exception ex ) {  
  8.         LogException(ex);  
  9.           
  10.         // .....................  
  11.     }  
  12. }  

这段代码有什么问题呢?

其实问题的线索在于:为什么要加try....catch语句,是因为知道可能会发生异常吗?

如果真有异常情况发生,这样处理后,后续的请求是不是会发生各种想像不到的错误?

显然这里不能吃掉异常,要不然后面的请求肯定会有问题,因为它们依赖的设置没有正确的初始化。

好吧,那我去掉 try.....catch语句,这样总该行了吧:

  1. void Application_Start(object sender, EventArgs e)  
  2. {  
  3.     //在应用程序启动时运行的代码  
  4.  
  5.     AppInitializer.Init();  
  6. }  

还是看来一下真实的运行情况吧。

如何在ASP.NET应用程序中初始化

噢,抱歉,我还真忘记了配置连接字符串,这个异常提示太给力了。

现在就加上连接字符串吗?

别急,想像一下,如果这个网站是一个真实的在线网站,会是什么情况呢?
答案有二种:

1. 另一个用户也发起了一次请求。

2. 当前用户看到错误页面后,重新刷新了一次当前页面。

现在我用Opera来扮演第二个浏览用户吧,还是打开同样的网址。

如何在ASP.NET应用程序中初始化

太奇怪了,第二个用户居然能打开页面,好吧,让他登录试试。

如何在ASP.NET应用程序中初始化

结果第二个用户看到的错误情况和第一个用户完全不同。

如果此时第一个用户刷新他的浏览器,发现页面又可以显示了,然而登录时,会看到与第二个用户一样的异常信息。

这个示例代码实在太简单了,我想维护人员根据NullReferenceException这个线索找下去,很快就能找到答案。如果初始化代码再复杂一些,比如SetSqlDependency()中出现异常呢,那么程序仍然能够正常运行,但是我们期望的缓存依赖可能就没有效果了,最终可能会产生性能问题,排查的难度就会大多了。

记得以前做项目时,就遇到过这种情况,当时感到很奇怪,为什么刷新一下就没黄页了,不过后面的错误就很折腾人了,最终也让我总结了这个教训。所以我建议:如果在初始化阶段出现了异常,干脆就别让程序继续运行了,每个请求都直接显示黄页,直到排除故障为止。

如何保证初始化异常一直显示?

当初始化发生异常时,如何保证初始化异常一直显示呢?

方法其实并不难,我们需要修改一下代码:

  1. private static Exception s_initException;  
  2.  
  3. void Application_Start(object sender, EventArgs e)  
  4. {  
  5.     try {  
  6.         AppInitializer.Init();  
  7.     }  
  8.     catch( Exception ex ) {  
  9.         // 记下初始化的异常。  
  10.         s_initException = ex;  
  11.     }      
  12. }  
  13.  
  14. protected void Application_BeginRequest(object sender, EventArgs e)  
  15. {  
  16.     // 如果存在初始化异常,就抛出来。  
  17.     // 直到开发人员发现这个异常,并已解决了异常为止。  
  18.     if( s_initException != null )  
  19.         throw s_initException;  
  20. }  

现在不管有多少个用户来访问,或者第一个访问者刷新浏览器多少次,都会看到同样的异常信息:

如何在ASP.NET应用程序中初始化

说明:Global.asax的这个问题在IIS7以上版本的集成模式下并不存在。

分享:ASP.NET七大身份验证方式及解决方案
在B/S系统开发中,经常需要使用身份验证。因为web应用程序非常特殊,和传统的C/S程序不同,默认情况下(不采用任何身份验证方式和权限控制手段),当你的程序在互联网/局域网上公开后,任何人都能够访问你的web应用程序的资源,这样很难保障应用程序安全性。通俗点来说:

来源:模板无忧//所属分类:ASP教程/更新时间:2015-06-11
相关ASP教程