对于Default选项来说,ASP.NET通过映射的HttpHandler类型是否实现了相关接口来决定具体的会话状态控制行为。在System.Web.SessionState命名空间下定义了IRequiresSessionState和IRequiresSessionState接口,如下面的代码片断所示,这两个都是不具有任何成员的空接口(我们一般称之为标记接口),而IReadOnlySessionState继承自IRequiresSessionState。如果HttpHandler实现了接口IReadOnlySessionState,则意味着采用ReadOnly模式,如果只实现了IRequiresSessionState则采用Required模式。
1: public interface IRequiresSessionState
2: {}
3: public interface IReadOnlySessionState : IRequiresSessionState
4: {}
具体采用何种会话状态行为取决于当前HTTP上下文(HttpContext.Current)。对于之前的版本,我们不能对当前HTTP上下文的会话状态行为模式进行动态的修改,ASP.NET 4.0为HttpContext定义了如下一个SetSessionStateBehavior方法是我们可以自由地选择会话状态行为模式。相同的方法同样定义在HttpContextBase中,它的子类HttpContextWrapper重写了这个方法并在内部会调用封装的HttpContext的同名方法。
- public sealed class HttpContext : IServiceProvider, IPrincipalContainer
- {
- //其他成员
- public void SetSessionStateBehavior(
- SessionStateBehavior sessionStateBehavior);
- }
- public class HttpContextBase: IServiceProvider
- {
- //其他成员
- public void SetSessionStateBehavior(SessionStateBehavior sessionStateBehavior);
- }
三、ControllerBuilder
用于激活Controller对象的ControllerFactory最终通过ControllerBuilder注册到ASP.NET MVC应用中。如下面的代码所示,ControllerBuilder定义了一个静态只读属性Current返回当前ControllerBuilder对象,这是针对整个Web应用的全局对象。两个SetControllerFactory方法重载用于注册ControllerFactory的类型或者实例,而GetControllerFactory方法返回一个具体的ControllerFactory对象。
- public class ControllerBuilder
- public IControllerFactory GetControllerFactory();
- public void SetControllerFactory(Type controllerFactoryType);
- public void SetControllerFactory(IControllerFactory controllerFactory);
- public HashSet<string> DefaultNamespaces { get; }
- public static ControllerBuilder Current { get; }
- }
具体来说,如果我们是注册的ControllerFactory的类型,那么GetControllerFactory在执行的时候会通过对注册类型的反射(调用Activator的静态方法CreateInstance)来创建具体的ControllerFactory(系统不会对创建的Controller进行缓存);如果注册的是一个具体的ControllerFactory对象,该对象直接从GetControllerFactory返回。
被ASP.NET路由系统进行拦截处理后会生成一个用于封装路由信息的RouteData对象