我正在尝试将MVC3应用程序与一些Nancy模块结合起来。在我的应用程序中,我正在尝试在MVC3控制器中设置会话变量,然后在Nancy模块中读取该变量。当我尝试在Nancy控制器中读取变量时,Session对象为null。
这是我的MVC3控制器,Nancy模块和root web.config的要点。
https://gist.github.com/3105219
看起来所有(大多数)挂起当前httpcontext的其他对象都不是null,并且在应用程序的MVC3部分中比较它时看起来“正常”。
编辑:进一步测试显示我无法访问原始Nancy应用程序中的ASP.NET会话。我使用本页底部的步骤“创建您的第一个Nancy应用程序”创建了应用程序。
https://github.com/NancyFx/Nancy/wiki/Introduction
这是简单的Nancy应用程序的web.config。
答案 0 :(得分:4)
继承IRequiresSessionState
以启用Asp.net
会话。
public class NancyAspHttpRequestHandler
: NancyHttpRequestHandler, IRequiresSessionState
{
}
并在处理程序注册中使用NancyAspHttpRequestHandler
,这可以通过Nancy.AspNet
托管来实现。
这将解决问题
答案 1 :(得分:3)
您必须创建BootStrapper
以在Nancy中提供会话服务。会话服务由ISession
接口提供。 Nancy提供了几个默认实现:NullSessionProvider
和Session
。我想默认的是NullSessionProvider
。另一个实现存储正在处理的数据,不使用cookie。要创建基于cookie的会话,您必须创建一个引导程序,如下所示。
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
CookieBasedSessions.Enable(pipelines);
}
}
修改强>
根据我的理解,Nancy使用它自己的上下文类来提供请求,会话,缓存和其他东西。它是有助于提供这些服务的bootstrappers。我不确定你可以在Nancy默认使用像HttpContext,HttpSession这样的ASP.NET对象。
答案 2 :(得分:2)
我跟进了prakash和AdrieanKhisbe的答案(它对我有用 - 但我有时间弄清楚如何)。
编写一个新的.cs文件,其中包含上一个答案中所述的内容:
public class NancyAspHttpRequestHandler:NancyHttpRequestHandler, IRequiresSessionState {
}
它是一个空类,但它继承自NancyHttpRequestHandler
和IRequiresSessionState
(Http会话状态)。
然后,在Web.config中,将Nancy.Hosting.Aspnet.NancyHttpRequestHandler
替换为新的NancyAspHttpRequestHandler
<system.webServer>
<handlers>
<!--add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" /-->
<add name="Nancy" verb="*" type="your_name_space.NancyAspHttpRequestHandler" path="*" />
</handlers>
</system.webServer>
现在,HttpContext.Current.Session
不再为空了。