Поддержание сеанса связанного приложения ASP.NET живым из другого приложения ASP.NET - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть 2 приложения, работающие в одном домене. Поток идет так:

  1. Заявка 1
  2. Приложение 1 -> Приложение 2
  3. Приложение 2 -> Приложение 1

Приложение 1 - это WebForms (asp.net framework 2.0), Приложение 2 - это ASP.NET MVC 3 (framework 4.0)

Пока пользователь включен Приложение 2 , я хотел бы сохранить сеанс на Приложение 1 .

При создании приложения 1 мы встроили обработчик «KeepSessionAlive.ashx», который просто выполняет Session («KeepSesssionAlive») = DateTime.Now () при запросе, как описано в этой статье. . Мы сделали это, потому что это приложение для оценки, и во время некоторых сложных этапов теста пользователю может потребоваться много времени, прежде чем он выберет ответ. Вот код:

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

Итак, я подумал, что могу вызвать тот же обработчик из Application 2 , используя $ .ajax (), я даже изучил использование jsonp, но, похоже, это не работает. Я написал код для записи всех переменных сеанса из KeepSessionAlive.ashx в файл и даже для возврата чего-либо через ответ jsonp, и данные выглядели правильно.

Однако, выполняя тест, в котором я задержался в Приложении 2 достаточно долго, чтобы истечь сеанс Приложении 1 , а затем пытался выполнить переход из Приложении 1 -> Приложение 2 , когда я попадаю на страницу возврата в Приложение 1 Приветствуется ошибка System.NullReferenceException: Object reference not set to an instance of an object., потому что я пытаюсь сослаться на один из объектов в сессии. Единственное значение в сеансе - Session (KeepSessionAlive). Я предполагаю, что это потому, что он создал новый сеанс, но если это так, почему мои тесты, в которых были записаны значения сеанса, отображали все переменные сеанса Application 1 ?

Существуют ли другие методы, которые можно использовать, чтобы сохранить Сессию Приложения 1 , пока пользователь заполняет формы в Приложение 2 ?

1 Ответ

6 голосов
/ 13 апреля 2011

Создайте страницу на каждом сайте, чтобы время от времени перезагружать маленькое изображение.
Теперь вместо изображения вы загружаете обработчик, который возвращает изображение.

<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 вы можете хранить обновления cookie с двух разных сайтов.

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

Related: Сброс тайм-аута сеанса без выполнения обратной передачи в ASP.Net

...