从MVC函数(Composite C-1)访问时,Session为null

时间:2016-03-21 19:40:27

标签: c# asp.net-mvc session c1-cms

我是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。

非常感谢任何帮助。

2 个答案:

答案 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管道。

您可以在此处查看源代码:

https://github.com/Orckestra/C1-Packages/blob/master/Composite.AspNet.MvcFunctions/Composite.AspNet.MvcFunctions/FunctionProvider/MvcFunctionBase.cs#L165

那就是说,这是一个错误,对当前Session的引用没有传递给新的HttpContext,我将在稍后讨论修复/更新包。