收藏本站|设为首页

您现在的位置: 首页 > 新闻中心 > 建站经验 > 详细内容

写程序时常被忽略的一些细节

2013-08-12 14:53 来源: 卓杰科技(www.zhuojie.cc) [ ]
一、Application_Start的异常与IIS经典模式
  在IIS6或者II7的经典模式下运行ASP.NET程序时,如果Application_Start事件中抛出了未捕获异常, 那么这个异常将显示一次。
二、HttpContext.Current并非无处不在
在以下情形中访问HttpContext.Current将会返回null
  1. 定时器的回调。
  2. Cache的移除通知。
  3. APM模式下异步完成回调。
  4. 主动创建线程或者将任务交给线程池来执行。
三、Timer可能会不起作用
  有时候我们会遇到一些诸如执行定时任务的需求,于是有些人可能会想到用定时器来实现, 在.net framework中,有二个Timer类型可以用于ASP.NET环境中,不过,Timer有可能会不起作用, 具体表现情况也会让你难以描述:不知道在什么时候定时器就停止工作了。
  这个问题很奇怪:当你在调试模式下,定时器是一直能正常工作的,但当你把网站部署起来, 运行时间久一些,便会发现定时器没有正常工作。
  为什么会这样呢?
  答案是:当网站在一段时间没有请求后,进程会被IIS回收(释放)。
  所以,在ASP.NET程序不适合执行【长久性】的定时任务,除非你能接受定时器会停止工作。
  类似的问题还有:在ASP.NET程序中将某个方法做为回调方法传给Win32程序,发现回调没有响应。
  正是由于这个原因,建议将长久性的定时任务或者接收Win32回调的程序用Windows Service的程序来实现
四、ashx的重用问题
  很多ASP.NET的开发人员都应该创建过ashx文件,例如下面这个:
public class Handler1 : IHttpHandler {
    public bool IsReusable {
        get {
            return false;
        }
    }
  我想不少人会对IsReusable这个属性感到好奇,于是去查一下IHttpHandler的定义,找到这个解释,
// 摘要:
//     获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
//
// 返回结果:
//     如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。
bool IsReusable { get; }
  看到可以重用,有些对性能关注的人可能会将它修改为返回true,其实改成什么都一样,因为它不起作用。
  不起作用的原因在这篇博客中有说明:http://www.cnblogs.com/fish-li/archive/2012/01/29/2331477.html
  当前登录用户信息有时获取不到
  在ASP.NET中,提供了以下方法让我们获取当前用户的信息,例如:
if( HttpContext.Current != null ) {
    // 检查当前用户是否已为一个已登录用户
    bool isAuthenticated = HttpContext.Current.Request.IsAuthenticated;
    // 获取当前请求的用户名
    string userName = HttpContext.Current.User.Identity.Name;
}
  不过,这段代码放在不同的地方,效果却截然不同。
  最近就遇到一个问题:有人问我为什么总是取不当前用户的用户名。
  网站采用的是Windows身份认证,因此,所有的请求都是经过IIS认证过的, 理论上说,变量isAuthenticated应该返回true,而userName应该是当前请求的用户名(Windows登录名),然而呢,在调试时, isAuthenticated的值是false, 后面的代码直接抛出一个空引用异常,因为User对象为null,太奇怪了,是吗?
  当出现这种情况时,我们应该检查代码在哪里被调用的。

本页关键词:

上一篇:教你怎么用Jquery 下一篇:怎么简写HTML代码