技术开发 频道

ASP.NET3.5开发SNS:安全及错误处理模块

  在本博客系统中,我们将在管理页面的侧栏中显示用户的登录状态,同时还提供一个选项以便用户退出应用程序。

  你可能还记得,管理侧栏定义于管理母版页面(View/Masters/Admin.Master)中。下列代码显示当前登录的用户名以及一个方便用户退出应用程序的选项:

<asp:LoginView ID="LoginViewBlogo" runat="server">
<LoggedInTemplate>
   您的登录名为:
<asp:LoginName ID="LoginName" runat="server" />
  
<br />
   (
<a id="LinkLogout" href="~/View/Pages/Logout.aspx" runat="server">退出</a>)
    
</LoggedInTemplate>
<AnonymousTemplate>
   您尚未登录
  
<br />
   (
<a id="LinkLogin" href="~/View/Pages/Login.aspx" runat="server">登录</a>)
</AnonymousTemplate>
</asp:LoginView>

  注意,上面代码中的logout链接指向了页面Logout.aspx。这个页面也很简单,其任务仅仅是在该表单的Page_Load事件代码中清除当前认证,然后把用户重定向回登录表单:

protected void Page_Load(object sender, EventArgs e)
{
   FormsAuthentication.SignOut();
   Response.Redirect(
"~/View/Pages/Login.aspx");
}

  至此,我们完全实现了系统的安全模型建设部分。

  2.系统中的错误处理

  我们要考虑的最后一个问题是系统的错误处理问题。在本博客系统中,我们的错误处理模式遵循如下标准:
 
  ·捕获我们估计的可能出现的错误并作出任何可能的处理。这样的一个示例是,在把一个新的标签保存之前我们需要检查是否已经存在这样的标签。如果我们不执行这样的检查,数据库将返回一个错误。
  ·使用一个应用程序级别的错误处理器来捕获未预料的错误。这个错误处理器将记录下该错误的所有细节,但是仅显示一个友好的错误页面给用户。如果在记录错误的过程中发生了错误,那么,当即捕获此错误,只是不对之作进一步的处理;否则,我们将导致进入一个无穷的循环中。

  下面,让我们具体看一下如何实现上述方案。

  首先,我们需要一种方式用于在数据库存储错误消息。事实上,我们已经实现了这一步,因为我们的数据库模型中拥有一个log(日志)表格,而且我们还提供一个Log业务对象和LogManager业务对象管理员用于把消息存储到数据库。

  接下来,应当在应用程序的全局文件Global.asax(位于应用程序的根文件夹下)中编写代码。这个文件中包含若干应用程序级的事件。不过,我们仅对Application_Error事件感兴趣。每次一个不可处理的异常发生时这个事件都将被触发。因此,在这个事件函数中放置我们的逻辑最合适:

protected void Application_Error(object sender, EventArgs e)
{
  
try
   {
      Server.Transfer(
"~/View/Pages/Error.aspx");
   }
  
catch (Exception)
   {
      
//在错误处理期间发生错误,不进行任何处理
      
//,否则,将导航无限循环
   }
}

  注意,上面代码中还没有记录下任何错误。所有发生的一切仅仅是把用户重定向到错误页面Error.aspx。

  下面,让我们来分析错误页面Error.aspx。这是一个非常简单的页面,其中仅包含了一些静态标记,以便告诉用户发生了一个错误。该页面直接继承自站点级别的母版页面Site.Master。把错误日志记录到数据库的实际操作发生在该页面的Page_Load事件中。在这个事件中,我们使用业务层的LogManager类来记录错误细节:

protected void Page_Load(object sender, EventArgs e)
{
  
try
   {
      
//把错误记录到数据库中
      Log l = new Log();
      l.date
= System.DateTime.Now;
      l.@event
= Server.GetLastError().ToString();
      LogManager.Save(l);
      Server.ClearError();
   }
  
catch (Exception)
   {
      
//在错误处理期间发生错误。不作任何处理;否则,将导致进入无穷循环。
   }
}

  如你所见,我们使用Server.GetLastError()方法检索在数据库中发生的最后一个未处理的异常。

  3.总结

  至此,我们完全结束了博客系统案例的讨论。在本博客中,我们基于标准的企业应用开发中的N层架构进行系统的设计,实现了系统主页、博客入口及各种博客文章查看页面、文件页面、标签云页面等用户接口页面和标签管理、博客入口管理和用户认证及错误处理等基本模块。

  时间所限,我们并没有针对所有页面实施AJAX修改方案,而且也没有考虑其他常见模块,如RSS信息聚合模块、各种统计模块、静态及动态广告模块等。

  最后的感想是,借助一个合理的N层架构、标准化的功能强大的ASP.NET 3.5控件和以前积累的开发体验,我们就能够快速开发出体面而漂亮的Web应用程序,而且这样的程序易于以后的维护和扩展。

0
相关文章