2012-09-21 3 views
2

현재 소켓에 대해 모든 세션을 통해 하나의 소켓을 만들고 연결해야하는 ASP.NET 사이트에서 작업하고 있습니다. 세션 객체로 소켓을 생성하고 저장했으며 페이지 리디렉션 후에 연결 상태를 유지하지만 버튼 클릭과 같은 재발행이 발생할 때마다 연결이 닫힙니다. 포스트 백 후에도 소켓 연결을 계속 유지할 수있는 방법이 있습니까? 단일 세션을 전체 세션에 사용하고 소켓을 다시 연결하는 것은 옵션이 아니기 때문입니다.포스트 백 후에 .NET 소켓 객체 연결을 유지하는 방법은 무엇입니까?

+0

코드를 표시하십시오. 포스트 백은 소켓을 닫지 않습니다. 이 소켓은 무엇을 위해 사용됩니까? – nunespascal

+0

당신이 말하는 연결 : 당신은 브라우저와 웹 서버 중 하나를 의미합니까, 아니면 웹 서버와 언급되지 않은 제 3의 장소 사이의 연결입니까? –

+0

@MarcGravell - 웹 서버와 일부 데이터가 소켓을 통해 전송되는 다른 서버 간의 연결입니다. – user1687951

답변

0

세션 상태가 깨지기 쉽습니다. 사실, 직렬화 세션 상태 공급자 (소켓은 직렬화 가능하지 않음)를 사용하는 경우 사용자가 설명하는 내용이 작동하지 않습니다.

그래서 : 오히려 세션에서 소켓를 저장하는 대신, 다른 곳 소켓을 넣어 - 세션에서 그것을 단지 및 저장 - 어쩌면 동기화 사전. 예를 들면 :

public static class SocketStore 
{ 
    static readonly Dictionary<string, Socket> socketStore 
      = new Dictionary<string, Socket>(); 
    public static string Add(Socket socket) 
    { 
     if(socket == null) throw new ArgumentNullException("socket"); 
     string newKey = Guid.NewGuid().ToString(); 
     lock(socketStore) { 
      socketStore.Add(newKey, socket); 
     } 
     return newKey; 
    } 
    public static Socket Get(string key) 
    { 
     if (string.IsNullOrEmpty(key)) throw new ArgumentNullException("key"); 
     Socket result; 
     lock (socketStore) 
     { 
      if (!socketStore.TryGetValue(key, out result)) result = null; 
     } 
     return result; 
    } 
} 

사용에서, 당신은 이미 소켓 (/ 키)가없는 경우, 연결을 만들 Add으로 저장하고 세션 키를 저장합니다. 페치 할 때는 null 케이스를 처리해야하며, 동일한 세션의 2 개의 동시 요청 (완벽하게 합법적)에 사용되는 동일한 소켓을 방지하기 위해 자체 동기화를 추가해야합니다.

그러나, 추가 참고 :

  • 당신이 요청을해야합니다
  • 건강하게 보이는 세션에서 오래 된 버려진 세션에서 소켓, 그리고 좀비 소켓을 청소하는 몇 가지 추가 프로세스를하는 것이 좋습니다 동일한 서버로 계속 되돌아옵니다. 클러스터에있는 경우 부하가 분산됩니다.
+0

고마워,이 소켓 연결을 유지하기 위해 작동하지만 다른 문제가 있습니다. 하나의 데이터 패킷을 보낸 후 다른 하나를 보낼 수 없습니다. 데이터 전송 사이에 기본 대기 기간이 있습니까? 아니면 먼저 모든 리소스를 해제해야합니까? – user1687951

+0

@ user1687951 어떤 API를 보내고 계십니까? (단지'Socket'에 최소한 3 개가 있습니다)? 또한 : * 무슨 일이 *? 예외가 발생합니까? 그렇다면 어떤 예외입니까? 그것은 차단합니까? 뭐? –

+0

System.Net.Socket 클래스의 Send (byte [] 버퍼, SocketFlags socketFlags) 메서드를 사용하고 있습니다. 그것은 막히고 나는 어떤 예외도 얻지 않을 것이다. 다음은 코드입니다. public string send (문자열 데이터) { byte [] buffer = Encoding.UTF8.GetBytes (data + "\ r \ n"); int byteCount = socket.Send (buffer, SocketFlags.None); } – user1687951

관련 문제