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

作者:   出处:互联网   2015-07-05 22:58:22   阅读:3

今天给大家介绍了4种在ASP.NET中执行初始化的方法,或许有些人会想:到底该选择哪种初始化方法呢?的确,方法越多越让人迷惑。

每个程序都需要初始化的过程,用来读取配置或者设置一些运行环境(变量),对于ASP.NET程序来说,又该在哪里执行初始化的任务呢?


 

想应该绝大多数人都知道在Global.asax中执行初始化的过程,然而有些细节是们需要关注的。


 

本文用例


 

在这篇的示例代码中,AppInitializer包含了网站的初始化的实现代码:


 

public static class AppInitializer  {  public static ConnectionStringSettings MyNorthwindConnectionSetting { get; private set; }  public static void Init()  {  // 读取连接字符串。  LoadConnectionString();  // 设置SQLSERVER缓存依赖通知。  SetSqlDependency();  // 其它的初始化操作。  OthersInit();  }  static void LoadConnectionString()  {  ConnectionStringSettings setting = ConfigurationManager.ConnectionStrings[ MyNorthwind ];  if( setting == null )  throw new ConfigurationException( 没有配置MyNorthwind连接字符串。 );  if( string.IsNullOrEmpty(setting.ConnectionString) )  throw new ConfigurationException( 没有为MyNorthwind连接字符串指定内容。 );  if( string.IsNullOrEmpty(setting.ProviderName) )  throw new ConfigurationException( 没有为MyNorthwind连接字符串指定ProviderName 。 );  // 保存读取到的连接字符串,供程序使用。  MyNorthwindConnectionSetting = setting;  }  static void SetSqlDependency()  {  // 判断SQLSERVER版本是否为 2005以上版本,  // 是否开启Service Broker的检查代码就不列出了。  SqlDependency.Start(MyNorthwindConnectionSetting.ConnectionString);  }  static void OthersInit()  {  // 其它的初始化操作。  // 例如:  // 1. 加载必要的缓存数据。  // 2. 检查上传目录是不存在。  // 3. ...................  }  } 


 

这段代码的意图很清楚,一定要确保正确的配置了数据库连接字符串,否则以异常的形式报告出来。


 

示例程序还有一个页面,Default.aspx


 

 body   form id= form1  runat= server   div   h1 User Login /h1   /div   p  >

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


protected void btnLogin_Click(object sender, EventArgs e)  {  bool ok = false;  using( SqlConnection connection  = new SqlConnection(AppInitializer.MyNorthwindConnectionSetting.ConnectionString) ) {  connection.Open();  // 其它的数据库操作。  ok = true;  }  if( ok )  Response.Redirect( Default2.aspx );  } 

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


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


void Application_Start(object sender, EventArgs e)  {  //在应用程序启动时运行的代码  try {  AppInitializer.Init();  }  catch( Exception ex ) {  LogException(ex);    // .....................  }  }  

这段代码有什么问题呢?


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


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


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


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


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

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



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


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


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

答案有二种:


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


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


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



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



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


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


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


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

Copyright© 2006-2015 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 渝ICP备12000264号 法律顾问:元炳律师事务所
客服软件
live chat