maxConcurrentSessions in WCF

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

일전에 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
maxConcurrentSessions in WCF  (0) 2013.11.21
SQL Double Split  (0) 2013.11.13
Optimizing IIS Performance  (2) 2013.11.07
클라이언트의 동시 연결 수(maxconnection)  (0) 2013.11.06

submit

잘 동작하는 WCF 서비스를 웹 프로젝트에서 참조하려고 하니, 다음과 오류를 뱉으면서 참조가 되지 않는다

 

사용자 지정 도구 경고: wsdl:portType을(를) 가져올 수 없음
세부 정보: WSDL 가져오기 확장을 실행하는 동안 예외가 발생했습니다.
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
오류: 파일이나 어셈블리 'DotNetOpenAuth.AspNet, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246' 또는
여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

 

 

 

이 WCF 서비스는 클라이언트 테스트 용으로 콘솔 응용프로그램과 윈도우 응용프로그램에서 모두 참조해서 잘 사용하던 것이었다.

 

오류를 내뱉은 이번 사례는 'ASP.NET MVC4 인터넷 응용프로그램'이다.

혹시나 해서 ASP.NET MVC3 인터넷 응용프로그램으로 WCF 참조를 시도해 보니.. 이건 잘 된다. 음.. 뭥미..

 

게다가 ASP.NET MVC4 Web API'로 시도해 보니, 이건 안되긴 하는데 오류 내용이 조금 다르다

사용자 지정 도구 경고: wsdl:portType을(를) 가져올 수 없음
세부 정보: WSDL 가져오기 확장을 실행하는 동안 예외가 발생했습니다.
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
오류: 파일이나 어셈블리 'EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 또는
여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

 

결국 WCF를 소비하는 클라이언트가 ASP.NET MVC4 일 경우 (조금씩 다르긴 하지만) 이와 같은 문제가 발생 하는 것을 확인하였다

 

이것은 WCF를 참조할 때 기본으로 설정되어 있는 '참조된 모든 어셈블리의 형식 재사용' 옵션 때문이라 하는데, 이 옵션을 제거하면 더 이상 참조 오류는 발생하지 않는다

 

어셈블리 재사용 옵션은 클라이언트에 동일 타입이 이미 존재할 경우, WCF 참조로부터 자동으로 생성되는 타입에서 제외되어 기존 클라이언트의 것을 재사용할 수 있도록 하는 편리한 기능인데 이 부분이 문제가 된다니 의아스럽다. 이 옵션의 자세한 내용은 아래 블로그 글에서 확인할 수 있다.

 

> 관련 글: VS.NET 2008 - 서비스 참조시 기존 데이터 컨테이너 DLL 사용

 

그리고 오류 내용을 보면, DotNetOpenAuth.AspNet 어셈블리의 종속성 문제인 듯 하여 관련 어셈블리만 재사용하지 않도록 설정해도 문제는 동일하게 발생한다.

 

결국 몇 번 시도 끝에 문제가 되는 어셈블리를 찾게 되었다.

ASP.NET MVC4 인터넷 응용프로그램일 경우: Microsoft.Web.WebPages.OAuth

 

ASP.NET MVC4 Web API일 경우:  System.Web.Providers

 

각각의 환경에서 위에 나열한 어셈블리만 재사용에서 제외해 버리면 잘 동작한다

아래 화면은 ASP.NET MVC4 인터넷 응용프로그램에서 Microsoft.Web.WebPages.OAuth를 제외한 모습이다

 

 

뭐.. 개별 프로젝트의 현상과 바로 적용 가능한 적절한 해결책은 찾았으나, 근원적인 원인에 대한 이해가 필요하다. 일단 여기까지 하고, 다음 기회에 알아 보기로 한다. 

 

 

 

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

간단한 C# 문법 Quiz  (1) 2013.07.11
나에게 유용했던 닷넷 서적  (2) 2013.07.04
WCF Service Reference Error(Cannot import wsdl:portType)  (0) 2013.07.03
IOC using Ninject  (0) 2013.06.18
Security in OAuth  (0) 2013.05.29
Bit Flag of Enum  (0) 2013.05.28
Tags WCF

submit