2011-03-10 37 views
2

我在ASP.NET中創建了HttpHandler類,並配置了一個網站來處理任何帶有* .test路徑的請求。在ASP.NET應用程序中丟失的會話值

public class GameHandler : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

    public void ProcessRequest (HttpContext context) 
    { 
     if (context.Request.ContentType == "application/json; charset=utf-8") 
     { 
      ... 
      switch (parameters ["type"]) 
      { 
       case "Setup": 
        result = Setup (context); 

        break; 

       case "DoStep": 
        result = DoStep (context, parameters); 

        break; 
      } 
      ... 
     } 
     else 
      context.Response.Write (@" 
        <html> 
         <head> 
         </head> 
         <body> 
          <!-- some HTML --> 
         </body> 
        </html>"); // this is returned on first request 
    } 

在安裝方法我有這樣的代碼:

context.Session ["Game"] = new Game(); 

然而,在DoStep方法,context.Session.Count = 0和context.Session [ 「遊戲」]是NULL。 在客戶端我使用jQuery來調用這些函數。這樣的調用看起來是這樣的:

$.ajax({ 
     url: "/test.test", 
     type: "POST", 
     data: "{'type':'Setup'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (result) {...} 
}); 

$.ajax({ 
     url: "/test.test", 
     type: "POST", 
     data: "{'type':'DoStep','row':'" + row + "','column':'" + column + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (result) {...} 
}); 

我懷疑的問題是,ASP.NET不知道這些要求從JavaScript屬於同一個會話發送,這就是爲什麼會話值會丟失。我認爲我需要發回一些cookie信息或者下一個要識別的請求,但事實是我沒有任何想法。

任何幫助真的很感激。

+0

也許你可以比較服務器的會話ID和客戶端(cookie,url)上的會話ID? – Menahem 2011-03-10 08:36:23

+0

編輯:是不是這個你問的問題[這裏]的一個副本(http://stackoverflow.com/questions/5245868/how-do-i-persist-session-values-in-asp-net)? – Menahem 2011-03-10 08:43:26

+0

是的,這是同樣的問題,但在這裏我更深入地描述了它,到目前爲止我還沒有得到任何好的答案。 – Zoliqa 2011-03-10 08:50:58

回答

1

如果有人遇到這個問題,我想指定發生這種情況,因爲我在ProcessRequest方法中使用了一些文件操作。

var doc = XDocument.Load (@"c:\XO_Game_Website\bin\test.xml"); 
if (context.Session ["something"] == null) 
{ 
    context.Session.Add("something", "something"); 
    doc.Root.Element ("xxx").Value = "null"; 
} 
else 
{ 
    doc.Root.Element ("xxx").Value = "not null"; 
} 
doc.Save("path"); 

一旦我刪除了doc.Save(「path」);從方法來看,一切都很好。儘管如此,我無法弄清楚爲什麼文件操作代碼會重置會話值。

快樂編碼。

+1

如果您更改bin文件夾中的文件,應用程序將重新啓動(您可以將新的/更改過的dll放在那裏)。在應用程序重新啓動時,清除所有*會話。 – 2011-03-14 13:51:29

+0

我有同樣的問題,但我沒有寫入bin文件夾....我正在創建一個新文件夾,但它也隱含在應用程序重新啓動。這篇文章保存了一天。 – GRGodoi 2011-04-12 11:08:19