3

我正在尝试将 MVC3 应用程序与一些 Nancy 模块结合起来。在我的应用程序中,我试图在 MVC3 控制器中设置一个会话变量,然后在 Nancy 模块中读取该变量。当我尝试读取 Nancy 控制器中的变量时,Session 对象为空。

这是我的 MVC3 控制器、Nancy 模块和根 web.config 的要点。

https://gist.github.com/3105219

在应用程序的 MVC3 部分中进行比较时,看起来挂在当前 httpcontext 上的所有(大多数)其他对象都不为空,并且看起来“正常”。

编辑:进一步的测试表明我无法在原始 Nancy 应用程序中访问 ASP.NET 会话。我使用本页底部“创建您的第一个 Nancy 应用程序”部分中的步骤创建了该应用程序。

https://github.com/NancyFx/Nancy/wiki/Introduction

这是简单的 Nancy 应用程序的 web.config。

https://gist.github.com/3105583

4

3 回答 3

4

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

public class NancyAspHttpRequestHandler 
: NancyHttpRequestHandler, IRequiresSessionState
{

}

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

这将解决问题

于 2015-04-11T23:36:44.927 回答
3

您必须在 Nancy 中创建一个BootStrapper提供会话服务。会话服务由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 使用它自己的上下文类来提供请求、会话、缓存和其他内容。帮助提供这些服务的是引导程序。我不确定您是否可以在 Nancy 中直接使用 HttpContext、HttpSession 等 ASP.NET 对象作为默认值。

于 2012-07-13T17:35:43.823 回答
2

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

编写一个新的 .cs 文件,其内容与上一个答案中所述完全相同:

公共类 NancyAspHttpRequestHandler : NancyHttpRequestHandler, IRequiresSessionState {

}

它是一个空类,但它既继承自(Http Session 状态)又继承NancyHttpRequestHandlerIRequiresSessionState(Http Session 状态)。

然后,在 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不再为空。

于 2016-11-02T16:20:21.420 回答