无法访问Nancy Module中的ASP.NET会话对象

时间:2012-07-13 15:33:38

标签: asp.net asp.net-mvc-3 nancy

我正在尝试将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。

https://gist.github.com/3105583

3 个答案:

答案 0 :(得分:4)

继承IRequiresSessionState以启用Asp.net会话。

public class NancyAspHttpRequestHandler 
: NancyHttpRequestHandler, IRequiresSessionState
{

}

并在处理程序注册中使用NancyAspHttpRequestHandler,这可以通过Nancy.AspNet托管来实现。

这将解决问题

答案 1 :(得分:3)

您必须创建BootStrapper以在Nancy中提供会话服务。会话服务由ISession接口提供。 Nancy提供了几个默认实现:NullSessionProviderSession。我想默认的是NullSessionProvider。另一个实现存储正在处理的数据,不使用cookie。要创建基于cookie的会话,您必须创建一个引导程序,如下所示。

public class Bootstrapper : DefaultNancyBootstrapper
{
    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines  pipelines)
    {
      CookieBasedSessions.Enable(pipelines);
    }
}

参考。 http://blog.csainty.com/

修改

根据我的理解,Nancy使用它自己的上下文类来提供请求,会话,缓存和其他东西。它是有助于提供这些服务的bootstrappers。我不确定你可以在Nancy默认使用像HttpContext,HttpSession这样的ASP.NET对象。

答案 2 :(得分:2)

我跟进了prakash和AdrieanKhisbe的答案(它对我有用 - 但我有时间弄清楚如何)。

编写一个新的.cs文件,其中包含上一个答案中所述的内容:

  

public class NancyAspHttpRequestHandler:NancyHttpRequestHandler,   IRequiresSessionState {

     

}

它是一个空类,但它继承自NancyHttpRequestHandlerIRequiresSessionState(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不再为空了。