我是Composite C1的新手,并且有以下情况:
我将MVC应用程序作为一组函数部署到Composite。问题是我需要从我的MVC函数访问会话,但它是null。
我测试了一些想法,但似乎没有一个对我有用。
Startup Handler初始化如下:
public static void OnBeforeInitialize()
{
var functions = MvcFunctionRegistry.NewFunctionCollection();
functions.RegisterController<HomeController>("Company.Home");
functions.RegisterAction<HomeController>("Index", "Company.HomeIndex");
functions.RouteCollection.MapMvcAttributeRoutes();
functions.RouteCollection.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
然后,从任何控制器调用会话:
protected override void OnActionExecuting(ActionExecutingContext context)
{
var session = this.Session; // returns null
var request = this.Request; // this one is ok
var response = this.Response; // this one is ok too
// ...
}
返回null。
非常感谢任何帮助。
答案 0 :(得分:0)
经过将近一天的时间试图弄清楚为什么会话为空,我发现我可以System.Web.HttpContext.Current.Session
访问OnActionExecuting
。所以我只是使用旧的HttpSessionStateWrapper
技巧来实现它:
protected override void OnActionExecuting(ActionExecutingContext context)
{
var session = System.Web.HttpContext.Current.Session;
HttpSessionStateBase sessionBase = new HttpSessionStateWrapper(session);
// ...
}
这仍然无法解决为什么Session为空的问题。根据我读到的所有参考文献,它应该是。控制器实施IRequiresSessionState
,路由问题以及许多其他可能的解决方案等问题未经成功测试。
最后,我很高兴,因为我可以参加会议及其所有宝贵的数据。
由于
答案 1 :(得分:0)
Session属性为null的原因是MVC函数呈现的实现方式 - 正在创建一个新的HttpContext实例来呈现该函数。这个新的HttpContext用于运行MVC管道。
您可以在此处查看源代码:
那就是说,这是一个错误,对当前Session的引用没有传递给新的HttpContext,我将在稍后讨论修复/更新包。