2014-12-02 129 views
1

我使用MVC 5單的主分支了,我懷疑是單聲道有失蹤實施以下屬性:只讀會話狀態MONO

[SessionState(SessionStateBehavior.ReadOnly)] 

我試圖來裝飾選擇的兩個具有屬性和Thread.Sleep(5000)的控制器。結果表明,這兩個請求是按順序執行的,而不是像預期的那樣。

爲了給出一個完整的信息,我一直在使用mod_mono(也是master分支)。

對於單個會話你有並行執行經驗嗎?

謝謝!

回答

0

請檢查引用: https://github.com/mono/mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Web/System.Web.SessionState_2.0/SessionStateBehavior.cs

請注意,某些Web服務器,如Apache,可能會阻止來自同一用戶比在一定circunstances圖像其他資源的併發請求。如果這是你的情況,讓我知道給你提供更多的細節。

+0

這就是參考,我使用這個枚舉作爲屬性。請問如何調試Apache服務器和運行asp.net服務器(mod_mono)之間的通信?我希望更多的細節。 – marxin 2014-12-04 20:24:18

0

我有同樣的問題,與fastcgi-mono-server4 + nginx和xsp4獨立,所以我得出結論,它必須是一個錯誤(或一些未實現的功能)在這個版本的單聲道(debian分佈3.8-2)。

我在web.config中解決了設置<sessionState mode="Off" />的問題,並在服務器端使用System.Runtime.Caching.MemoryCache處理會話,並使用由GUID(用於會話ID仿真)和實際字符串組成的密鑰。

設置我在我的控制器基類

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(HttpContext.Request.Cookies["sid"] == null 
     && HttpContext.Response.Cookies["sid"] == null) { 
     HttpCookie htsid = new HttpCookie("sid", Guid.NewGuid().ToString()); 
     HttpContext.Response.Cookies.Set(htsid); 
    } 
    //... 
} 

寫此覆蓋的餅乾和我添加了一個小幫手,以獲得相同的基類

internal string sid { 
    get { 
     HttpCookie htk = HttpContext.Request.Cookies["sid"]; 
     if(htk == null) { 
      htk = HttpContext.Response.Cookies["sid"]; 
     } 

     return htk == null ? null : htk.Value; 
    } 
} 

這解決了會話ID我單聲道問題,我確實需要來自同一個會話的併發連接,我需要保持每個會話的狀態值,但是您的里程可能會有所不同。