我是复合 C1 的新手,有以下情况:
我正在将 MVC 应用程序作为一组函数部署到复合。问题是我需要从我的 MVC 函数访问会话,但它是空的。
我已经测试了一些想法,但似乎没有一个适合我。
- 在 ASP.NET 内运行 MVC 时 ASP.NET 会话为空
- MVC 5 会话为空
- 从一个控制器重定向到另一个控制器时会话为空 ASP.NET MVC
- MVC ASP.net 会话为空
- ASP.NET MVC - 会话为空
启动处理程序初始化如下:
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
// ...
}
返回空值。
任何帮助真的非常感谢。
在试图弄清楚为什么会话为空将近一天后,我发现我可以从OnActionExecuting
访问System.Web.HttpContext.Current.Session
。所以我只是使用旧的HttpSessionStateWrapper
技巧来使其工作:
protected override void OnActionExecuting(ActionExecutingContext context)
{
var session = System.Web.HttpContext.Current.Session;
HttpSessionStateBase sessionBase = new HttpSessionStateWrapper(session);
// ...
}
这仍然不能解决为什么会话为空的问题。根据我阅读的所有参考资料,应该是。诸如控制器实现IRequiresSessionState
,路由问题以及许多其他可能的解决方案之类的事情都没有成功测试。
因为我可以访问会话及其所有宝贵的数据。
谢谢
Session 属性为 null 的原因是 MVC 函数呈现的实现方式 - 正在创建 HttpContext 的新实例来呈现函数。这个新的 HttpContext 用于运行 MVC 管道。
您可以在此处查看源代码:
https://github.com/Orckestra/C1-Packages/blob/master/Composite.AspNet.MvcFunctions/Composite.AspNet.MvcFunctions/FunctionProvider/MvcFunctionBase.cs#L165
也就是说,这是一个错误,对当前会话的引用没有传递到新的 HttpContext,我稍后会研究修复/更新包。