ASP.NET常被忽视的一些细节(1)

作者:   出处:互联网   2015-07-04 23:25:22   阅读:1

其实这里是ASP.NET应用程序中一个容易被忽略的经节。后来想想,类似这样的细节问题何止这一个,今天就把能想到的容易被忽视的细节问题都写出来,希望大家小心这些问题。

前段时间碰到一个问题:为什么在ASP.NET程序中定时器有时候会不工作? 


 

这个问题看起来很奇怪,代码好像也没错,但就是结果与预期不一致。


 

其实这里是ASP.NET应用程序中一个容易被忽略的经节。后来想想,类似这样的细节问题何止这一个,今天就把能想到的容易被忽视的细节问题都写出来,希望大家小心这些问题。 


 

想到以前的中也零散的说过了一些,所以这篇中也把它们列出来了,不过,对于以前谈过的内容,这里将只会简略地说明。 


 

HttpContext.Current并非无处不在


 

这个问题是上个月的中提到的问题,原文链接:http://www.cnblogs.com/fish-li/archive/2015/04/06/3002940.html


 

在以下情形中访问HttpContext.Current将会返回null


 

1. 定时器的回调。


 

2. Cache的移除通知。


 

3. APM模式下异步完成回调。


 

4. 主动创建线程或者将任务交给线程池来执行。 


 

所以,在写类库时,请注意这个问题。


 

Application_Start的异常与IIS经典模式


 

在IIS6或者II7的经典模式下运行ASP.NET程序时,如果Application_Start事件中抛出了未捕获异常,那么 这个异常将显示一次。


 

关于这个问题的更多细节介绍请点击:http://www.cnblogs.com/fish-li/archive/2015/03/24/2979780.html


 

QueryString,Form允许重复的KEY


 

们经常见到的集合,例如:Hashtable, Dictionary,它们都要求KEY是唯一的,然而, HttpRequest的QueryString,Form集合实例却 允许KEY重复,当遇到KEY重复时,通过索引器访问集合时, 会将KEY对应的所有元素值用逗号拼接起来。


 

为什么会这样,因为这二个集合的类型是NameValueCollection,类似的,Headers集合也是这样。 


 

由于这个特殊性与们常见的情形不一致,所以们需要注意这个差别,当然了,有些时候们还可以利用这个行为实现一些特殊的需求,关于这个细节的更多介绍请参考:http://www.cnblogs.com/fish-li/archive/2015/12/06/2278463.html ,在这篇中,还介绍了HttpRequest的二个索引器也是值得们注意的。 


 

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/2015/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,太奇怪了,是吗? 


 

当出现这种情况时,们应该检查代码在哪里被调用的。


 

结果在追问下,发现代码是在一个HttpModule中调用的,且发生在订阅HttpApplication的BeginRequest事件中。找到这里,原因也就找到了,此时(在这个阶段)还没有经过ASP.NET的身份认证检查, User对象对象根本就没有构造出来,现在去访问,当然取不到结果。 


 

凭良心说,这个还真算不上ASP.NET留给们的坑,只怪一些人对管线事件不了解。 

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