一、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,太奇怪了,是吗?
当出现这种情况时,我们应该检查代码在哪里被调用的。