2011-04-12 65 views
5

我有2個應用程序在同一個域上運行。該流程行進像這樣:從另一個ASP.NET應用程序保持相關的ASP.NET應用程序的會話

  1. 應用1
  2. 應用1 - >應用2
  3. 應用2 - >應用1

應用1是的WebForms(asp.net框架2.0),應用2是ASP.NET MVC 3(框架4.0)

當用戶在應用,我想保持會話處於活動上應用1

在建設應用1,我們建立了一個 「KeepSessionAlive.ashx」 處理程序簡單地做會議( 「KeepSesssionAlive」)= DateTime.Now()時要求,如this article描述。我們這樣做是因爲這是一個評估應用程序,在測試的一些較難部分中,用戶可能需要很長時間才能選擇答案。下面是代碼:

Public Class KeepSessionAlive : Implements IHttpHandler, IRequiresSessionState 

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 
     context.Session("KeepSessionAlive") = DateTime.Now       
    End Sub 

    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable 
     Get 
      Return False 
     End Get 
    End Property 

End Class 

然後,我簡單地使用定期調用內Application 1這個處理程序的jQuery: $.post("KeepSessionAlive.ashx", null, function() { });

所以,我想我可以用$就調用相同的處理從應用2 (),我甚至研究過使用jsonp,但這似乎並不奏效。我編寫了將KeepSessionAlive.ashx中的所有會話變量記錄到文件中的代碼,甚至通過jsonp響應來返回內容,並且數據看起來正確。

然而,做一個測試,我在應用徘徊2足夠長的時間申請1的會議結束,然後試圖從應用1做過渡 - >應用2,當我到達返回頁面應用程序1我遇到了System.NullReferenceException: Object reference not set to an instance of an object.錯誤,因爲我試圖引用Session中的一個對象。會話中唯一的值是Session(「KeepSessionAlive」)。我認爲這是因爲它創建了一個新的會話,但是如果是這樣的話,爲什麼我的測試會記錄會話值,顯示所有的會話變量?

是否有任何其他方法我可以用它來保持申請1的會議還活着,而用戶在應用2填寫表格?

+0

執行應用程序共享一個應用程序池,或者是他們隔離?如果它們是孤立的,每個應用程序是否有「KeepSessionAlive.ashx」,或者是應用程序1中唯一一個? – 2011-04-12 23:16:30

+0

@Chris Pebble - 他們在孤立的應用程序池(應用程序1是2.0框架應用程序,應用程序2是4.0)。只有應用程序1具有「KeepSessionAlive.ashx」 – JustinP8 2011-04-13 15:27:00

回答

6

在每個網站上製作一個頁面,即時重新加載一個小圖片。
現在不是圖像,而是加載一個返回圖像的處理程序。

<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" alt="" /> 

<script language="javascript" type="text/javascript"> 
    var myImg = document.getElementById("keepAliveIMG"); 

    if (myImg){ 
     window.setInterval(function(){ 
       myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random()); 
      }, 6000); 
    } 
</script> 

然後在您的應用程序中使用iframe加載其他應用程序頁面,並重新載入圖像。或者通常使用iframe,因爲在iframe中,您可以保留來自2個不同站點的cookie更新。

<iframe src="application2.aspx" width="0" height="0"></iframe> 

相關:Reset session timeout without doing postback in ASP.Net

+0

謝謝!這確實起作用,但我最終在KeepSessionAlive.aspx頁面(都在應用程序1)上調用KeepSessionAlive.ashx處理程序的時間間隔而不是.gif。應用程序2只是將iframe附加到身體上,並將src設置爲Application1/KeepSessionAlive.aspx。 – JustinP8 2011-04-13 22:05:39

+0

@ JustinP8是的圖像調用不是觸發會話的100%garandy,但aspx確實觸發它。你的解決方案的技巧是iframe。 – Aristos 2011-04-14 07:44:42

相關問題