5

同じドメインで 2 つのアプリケーションを実行しています。流れは次のようになります。

  1. アプリケーション 1
  2. アプリケーション 1 ->アプリケーション 2
  3. アプリケーション 2 ->アプリケーション 1

アプリケーション 1は WebForms (asp.net フレームワーク 2.0)、アプリケーション 2は ASP.NET MVC 3 (フレームワーク 4.0) です。

ユーザーがApplication 2を使用している間、 Application 1でセッションを維持したいと思います。

アプリケーション 1をビルドするときに、この記事で説明されているように、要求されたときに単に Session("KeepSesssionAlive") = DateTime.Now() を実行する "KeepSessionAlive.ashx" ハンドラーを組み込みました。これは評価アプリケーションであり、テストの難しい部分では、ユーザーが回答を選択するまでに長い時間がかかる可能性があるためです。コードは次のとおりです。

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() { });

したがって、$.ajax() を使用してアプリケーション 2から同じハンドラーを呼び出すことができると考え、jsonp を使用して調べましたが、これは機能していないようです。KeepSessionAlive.ashx からのすべてのセッション変数をファイルに記録し、さらには jsonp 応答を介してデータを返すコードを書きましたが、データは正しく見えました。

ただし、 Application 1のセッションが期限切れになるのに十分な時間Application 2にとどまるテストを実行し、 Application 1 -> Application 2からの移行を試行すると、 Application 1の戻りページに到達すると、挨拶されますセッション内のオブジェクトの 1 つを参照しようとしているため、エラーが発生しました。セッションの唯一の値は、Session("KeepSessionAlive") です。これは、新しいセッションが作成されたためだと思いますが、その場合、セッション値をログに記録したテストでApplication 1のすべてのセッション変数が表示されたのはなぜですか?System.NullReferenceException: Object reference not set to an instance of an object.

ユーザーがアプリケーション 2でフォームに入力している間、アプリケーション 1のセッションを維持するために使用できる他の方法はありますか?

4

1 に答える 1

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>

関連 : ASP.Net でポストバックを行わずにセッション タイムアウトをリセットする

于 2011-04-13T00:46:25.063 に答える