我在ASP MVC3中使用autofac实现了一个自定义控制器工厂,通过派生DefaultControllerFactory实现了一个非常基本的插件管理。
在覆盖的GetControllerType(RequestContext requestContext,string controllerName)方法中,我使用会话变量或httpcontext.current.user进行一些检查,以确定我必须向最终用户提供哪种控制器类型。
关键是,如果我执行正常的GET(或者在视图中使用子进程),那么在调用GetControllerType时我有两个set,但是如果我执行POST ajax调用(使用contentType:'application / json; charset = utf-8')通过jquery,直接到actionmethod,用户和会话在我的httpcontext中为空,但是当我尝试在我的控制器动作(或动作过滤器)中访问它们时,它们会立即设置。 / p>
在这种情况下,AcquireRequestState永远不会被触发,如果我浏览RequestContext属性,我可以看到会话的cookie(带有会话ID)是有效的。
你有任何提示吗?为什么在正常的GET调用会话和用户设置的时候,我没有这个问题?
代码是这样的:
protected override Type GetControllerType(RequestContext requestContext, string controllerName)
{
if(plugins.All.Where(w=> w.Name == HttpContext.Current.Session["pluginName"].ToString() && w.User == HttpContext.Current.User.Identity.Name)
[do stuff]
}
我可以避免使用Session,但我无法避免匹配当前用户。