2012-07-13 49 views
2

我試圖將MVC3應用程序與一些Nancy模塊組合在一起。在我的應用程序中,我試圖在MVC3控制器中設置會話變量,然後在Nancy模塊中讀取該變量。當我嘗試讀取Nancy控制器中的變量時,Session對象爲null。無法訪問南希模塊中的ASP.NET會話對象

這是我的MVC3控制器,Nancy模塊和根web.config的要點。

https://gist.github.com/3105219

它看起來像所有(最)掛在當前HttpContext其他對象的不爲空,看起來「正常」的應用程序的MVC3部分比較時。

編輯:進一步測試表明,我無法訪問原始南希應用程序中的ASP.NET會話。我使用本頁底部「創建您的第一個Nancy應用程序」一節中的步驟創建了該應用程序。

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

下面是簡單的南希應用程序的web.config。

https://gist.github.com/3105583

回答

3

你必須創建一個BootStrapper在南希提供會議服務。會話服務由ISession接口提供。南希有幾個默認實現:NullSessionProviderSession。我想默認的是NullSessionProvider。另一個實現將數據存儲在進程中,不使用cookie。要創建基於cookie的會話,您必須創建如下的引導程序。

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

Ref。 http://blog.csainty.com/

編輯:

從我的理解南希使用它自己的上下文類提供請求,會話,緩存和其他的東西。這是幫助提供這些服務的引導程序。我不確定你可以直接使用像HttpContext,HttpSession這樣的ASP.NET對象作爲南希的默認值。

+0

是基於cookie(客戶端)會話存儲而不是服務器端會話存儲?我認爲這是Nancy自己的管理狀態的方法,它與內存會話存儲中的ASP.NET運行時分開。 當我嘗試這個時,即使它被設置在MVC3控制器上,Request.Session [「First_Name」]也不存在。 – 2012-07-13 19:03:16

+0

更多的試驗和錯誤顯示我可以使用Nancy Request.Session來保持Nancy路由的狀態,但System.Web.HttpContext.Current.Session仍然爲空,並且Nancy Request.Session爲空。 – 2012-07-13 19:08:30

+0

@Rob我也在學習階段!基於我的介紹,我想南希並沒有使用System.Web.HttpContext。它使用它自己的上下文類,我想這主要是爲了幫助Nancy在任何環境中運行(不知道,但!)。我剛剛下載了源代碼並運行搜索。 – VJAI 2012-07-13 20:03:10

4

繼承IRequiresSessionState以啓用Asp.net會話。

public class NancyAspHttpRequestHandler 
: NancyHttpRequestHandler, IRequiresSessionState 
{ 

} 

,並使用在處理程序註冊NancyAspHttpRequestHandler,這可以通過使用Nancy.AspNet託管是可能的。

這將解決我跟進普拉卡什和AdrieanKhisbe的回答問題

+0

好的答案,不知道爲什麼沒有人已經upvoted這個 - 解決了原來的問題。謝謝! – tommed 2016-04-12 11:44:03

2

(它爲我工作 - 但我有一些時間來弄清楚如何)。

寫一個新的。與在之前回答說正是內容CS文件:

公共類NancyAspHttpRequestHandler:NancyHttpRequestHandler, IRequiresSessionState {

}

這是一個空類,但無論是從NancyHttpRequestHandler繼承和IRequiresSessionState(Http會話狀態)。

然後,在Web.config中,通過這種新的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> 

更換Nancy.Hosting.Aspnet.NancyHttpRequestHandler現在,HttpContext.Current.Session不爲空了。