maxConcurrentSessions in WCF

Posted in .NET Framework // Posted at 2013. 11. 21. 15:05
728x90

일전에 WCF 서비스 스로톨링(Service Throttling)의 기본 값을 알아본 바 있다.

=> http://m.mkexdev.net/189

 

 

 

 

 

스로톨링 항목 중, 최대 연결 세션 수를 제한하는 maxConcurrentSessions 라는 속성이 있는데, 이 값이 세션을 사용하지 않는 바인딩 환경에서도 제한값으로 동작하는지 궁금해 졌다.

 

WCF 서적을 보니, 트랜스포트 세션/보안 세션/신뢰 세션 등을 사용하지 않는 바인딩에서는 이 속성은 의미없다라고 설명하고 있으나, 어떤 인터넷 자료에서는 그렇지 않다는 예기가 있다.

 

상식적으로 생각해 봐도, 세션에 기반하지 않는 바인딩이라면 세션 제한 수가 무의미한게 맞는 듯 하지만 확실히 해두기 위해 테스트를 수행해 보았다.

 

두 개의 WCF 서비스를 만들고, 하나는 basicHttpBinding 으로 나머지 하나는 wsHttpBinding 기반의 신뢰세션을 사용하도록 한 뒤 세션 제한 수를 5로 설정하고 클라이언트에서 각각 10번씩 호출해 본다. 이때 세션 제한 수에 걸리도록, 프록시 객체를 닫지(Close) 않도록 한다.

 

//WCF Service 설정

<serviceThrottling maxConcurrentSessions="5" /> 

 

//클라이언트 코드

for (int i = 0; i < 10; i++)
{
       ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client();                
       Console.WriteLine(string.Format("{0}-{1}",i,proxy.GetData(7)));
       //proxy.Close(); //세션 제한수에 걸리도록 프록시를 닫지 않는다.
}

 

결과는 예상했던 대로, 세션을 사용하지 않는 basicHttpBinding은 maxConcurrentSessions 제한 값과 무관하게 10번 모두 호출되었다. 반면 신뢰 세션을 사용하도록 한 wsHttpBinding은 이 제한값에 영향을 받아 5번 호출되고 대기하다가 결국 Timeout 오류가 발생했다.

 

그래서 이렇게 결론을 내렸다.

: 세션을 사용하지 않는 바인딩 환경에서는 maxConcurrentSessions 제한 값이 무의미하다.

 

좀 더 테스트 해보기 위해, wsHttpBinding에서 신뢰세션을 제거하고 테스트를 해 보기로 했다.

wsHttpBinding에서 신뢰 세션을 제거하면 결국 그 어떤 세션도 사용하지 않게 되므로 basicHttpBinding와 같이 제한 값이 무의미해져야 하는데, 테스트 결과는 여전히 5번 호출 뒤 대기하는 것이 확인되었다.

 

이해할 수 없는 결과로 몇 번의 삽질을 거듭하다가 문득, wsHttpBinding의 기본 보안 모드가 message이고 클라이언트 신원증명이 윈도우계정이라는 것이 떠올라 해법을 찾게 되었다.

 

간혹, wsHttpBinding 바인딩을 사용하는 WCF 서비스를 개발할 때, 본인의 PC에서는 잘 동작하던 것이 서비스를 원격 서버로 이동하면 보안문제가 발생하는 것을 경험해 보았을 것이다. 이것이 바로 wsHttpBinding가 기본적으로 Message 보안 모드에 윈도우 계정에 의한 클라이언트 자격증명이 이뤄지기 때문에 그런 것이다. 즉 로컬 환경에 서비스와 클라이언트가 모두 존재할 경우 윈도우 인증이 자동으로 가능해지기 때문에 로컬에서는 문제가 없었던 것이다. 필자 역시 과거 이러한 경험을 반추하여 위와 같은 해법을 찾게 된 것이다.

 

결국 wsHttpBinding에 기본 모안보드를 변경하기 위해 명시적으로 다음과 같이 설정을 하고 테스트를 해 보니 basicHttpBinding과 동일하게 10번 모두 정상 호출되었다.

<wsHttpBinding>
     <binding name="myBinding">
         <security mode="None"></security>
      </binding>
</wsHttpBinding>

 

즉 결론은 동일하다.
: 세션을 사용하지 않는 바인딩 환경(basicHttpBinding, wsHttpBinding 모두)에서는 maxConcurrentSessions 제한 값이 무의미하다.

(참고: wsHttpBinding 일 경우, 보안모드를 명시적으로 None로 설정해야 보안세션이 사용되지 않는다.) 

 

 

'.NET Framework' 카테고리의 다른 글

Caching in WCF  (2) 2014.02.21
ASP.NET SignalR  (0) 2013.12.06
SQL Double Split  (0) 2013.11.13
Optimizing IIS Performance  (2) 2013.11.07
클라이언트의 동시 연결 수(maxconnection)  (0) 2013.11.06