2011-04-12 4 views
5

두 개의 응용 프로그램이 동일한 도메인에서 실행되고 있습니다. 흐름과 같이 진행한다 :관련 ASP.NET 응용 프로그램의 세션을 다른 ASP.NET 응용 프로그램에서 활성 상태로 유지

  1. 출원 1
  2. 출원 1 ->애플리케이션 2
  3. 응용 2 ->출원 1

출원 1 웹폼 (asp.net 프레임 워크 2.0), 응용 프로그램이입니다 ASP.NET MVC 3 (프레임 워크 4.0)

사용자가 2, 나는 응용 프로그램에 세션을 활성 상태를 유지하고 싶습니다 응용 프로그램에있는 동안 1.

응용 프로그램 1를 구축하는 동안, 우리는 단순히 세션 ("KeepSesssionAlive") = DateTime.Now을하는 "KeepSessionAlive.ashx"핸들러에 내장() 요청이있을 경우, this article에 설명 된대로. 이것이 평가 응용 프로그램이기 때문에 테스트를 더 어렵게 만들었으므로 사용자는 대답을 선택하기까지 오랜 시간이 걸릴 수 있습니다. $.post("KeepSessionAlive.ashx", null, function() { });

그래서, 나는 $ 아약스 사용 응용 프로그램이에서 동일한 핸들러를 호출 할 수 있습니다 생각 : 나는 단순히 사용 Application 1 내에서 주기적으로이 핸들러를 호출 jQuery를 다음

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 

: 여기에 코드입니다(), jsonp를 사용하는 방법을 살펴 보았지만 작동하지 않는 것 같습니다. KeepSessionAlive.ashx의 모든 세션 변수를 파일에 기록하는 코드를 작성하고 심지어 jsonp 응답을 통해 물건을 반환하기도하고 데이터가 올바르게 보입니다.

그러나, 응용 프로그램 1에서 전환을하려고 다음 만료 나는 응용 프로그램 1의 세션에 대해 충분히 2응용 프로그램에서 서성하는 시험을하고 ->응용 프로그램이 때 내가 돌아 가기 페이지에 도달 응용 프로그램 1 나는 세션에서 개체 중 하나를 참조하려고하기 때문에 System.NullReferenceException: Object reference not set to an instance of an object. 오류로 인사합니다. 세션의 유일한 값은 Session ("KeepSessionAlive")입니다. 나는 그것이 새로운 세션을 만들었 기 때문이라고 가정하지만, 그렇다면 왜 세션 값을 기록한 테스트가 모두 의 응용 프로그램 1의 세션 변수를 표시했는지 기록 했습니까? 사용자가 응용 프로그램이의 양식을 작성하는 동안 내가 살아 응용 프로그램 1의 세션을 유지하는 데 사용할 수있는 다른 방법은

이 있습니까?

+0

가 수행을하는 응용 프로그램은 응용 프로그램 풀을 공유하거나 고립입니까? 격리되어있는 경우 각 응용 프로그램에 "KeepSessionAlive.ashx"가 있거나 응용 프로그램 1의 응용 프로그램 하나뿐입니까? –

+0

@Chris Pebble - 격리 된 응용 프로그램 풀에 있습니다 (응용 프로그램 1은 2.0 프레임 워크 응용 프로그램이고 응용 프로그램 2는 4.0 임). 응용 프로그램 1에만 "KeepSessionAlive.ashx"가 있습니다. – JustinP8

답변

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을 사용하십시오.

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

관련 : Reset session timeout without doing postback in ASP.Net

+0

감사합니다! 이 작업을했지만 내 KeepSessionAlive.ashx 처리기를 .gif 대신 일정 시간 (KeepSessionAlive.aspx 페이지) (응용 프로그램 1 둘 다)에서 호출합니다. 응용 프로그램 2는 src가 Application1/KeepSessionAlive.aspx로 설정된 iframe을 본문에 추가했습니다. – JustinP8

+0

@ JustinP8 예 이미지 호출은 세션을 트리거하는 100 % garandy가 아니지만 aspx가 확실히 트리거합니다. 솔루션의 트릭은 iframe입니다. – Aristos

관련 문제