每个程序都需要初始化的过程,用来读取配置或者设置一些运行环境(变量),对于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 style="line-height: 150%;">
- UserName: <asp:TextBox ID="txtUserName" runat="server" Width="200px" Text="Fish Li"></asp:TextBox><br />
- Password: <asp:TextBox ID="txtPassword" runat="server" Width="200px" TextMode="Password"></asp:TextBox><br />
- <asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />
- </p>
- </form>
- </body>
其实就是一个登录页面,后台代码为:
- 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语句,是因为知道可能会发生异常吗?
如果真有异常情况发生,这样处理后,后续的请求是不是会发生各种想像不到的错误?
显然这里不能吃掉异常,要不然后面的请求肯定会有问题,因为它们依赖的设置没有正确的初