2011-01-20 5 views
2

WCF 서비스를 호출하는 asp.net 앱이 있습니다. 나는 잠시 동안 간헐적 인 타임 아웃을 겪었으므로 트레이스 로그를 생성하기로 결정했다. 시간 제한을 받고 난 후에 나는 로그 파일에 아래의 메시지를 발견WCF 오류 - 시스템이 스로틀 'MaxConcurrentSessions'에 설정된 제한을 초과했습니다.

시스템은 스로틀 'MaxConcurrentSessions'에 대해 설정 한 제한을했다. 이 스로틀 제한 10. 스로틀 값으로 설정 하였다 serviceThrottle 요소 또는 동작 ServiceThrottlingBehavior에 'MaxConcurrentSessions' 속성을 변경함으로써 특성 'maxConcurrentSessions'를 수정 의해 변경 될 수있다.

동시 세션이 합산되는 이유를 이해할 수 없기 때문에 매번 클라이언트 연결을 닫을 수 있지만 문제가 있습니다. 아래는 내가 만드는 일반적인 호출입니다 : 내가 client.Close을 실행하면

try 
    { 
     //create proxy 
     client = new CAEServiceContractClient(); 

     response = client.GetSecurityRecords(item); 
     totalRecords = response.TotalRecords; 

     securityListView.DataSource = response.SecurityItemColl; 
     securityListView.DataBind(); 

     // Always close the client. 
     client.Close(); 
     success = true; 
    } 
    finally 
    { 
     if (!success) 
     { 
      client.Abort(); 
     } 
    } 

그래서 제 질문은, 왜 세션이 파괴되지 않는됩니다()?

TIA.

+0

어떤 입찰가를 사용하십니까? 오류가 발생했을 때 사이트에 액세스하는 클라이언트의 수는 얼마입니까? –

+0

@ 라디 슬라브 내일은 확인 하겠지만, 그게 wsHttpBinding 인 것 같아요. –

+0

@ 라디 슬라브 우리는 아직 개발 중입니다. 그래서 오류가 발생했을 때 서비스에 액세스하는 것은 저뿐입니다. –

답변

1

위의 코드에서 로컬 변수로 선언 된 success이 보이지 않으며 false로 설정하는 것도 볼 수 없습니다. 첫 번째 성공적인 통화에서 true으로 설정되고 그런 식으로 머무는 것이 반원 일 수 있습니까? 일반적으로

using (var client = new CAEServiceContractClient()) 
{ 
    response = client.GetSecurityRecords(item); 
    totalRecords = response.TotalRecords; 

    securityListView.DataSource = response.SecurityItemColl; 
    securityListView.DataBind(); 
} 

using 문은 보장 그 using 블록이 완료되면 (: 어떤 경우에

, 즉 전체 코드 블록 (버그가 적은)이 같은 이해하는 것이 간단하기 위해 다시 작성 될 수있다 또는 예외적으로 비정상적으로 발생하는 경우) client 변수가 처리되어 연결이 닫힙니다 ( .Dispose()).

편집 : 라디 Mrnka 지적으로 ClientBase.Dispose() 방법은 어떤 경우에 예외를 던지는 나쁜 버릇이있다. here과 같이 .Dispose() 메서드를 부분 CAEServiceContractClient 클래스에 구현해야합니다.

+3

@Allon : 이것은 WCF anti-pattern입니다! http://omaralzabir.com/do-not-use-using-in-wcf-client/ –

+0

@Ladislav : 그것은 반 패턴이 아니며 단순히 'ClientBase' 클래스의 잘못된 디자인입니다. 당신이 링크 한 기사). 하지만 제 관심을 가져 주셔서 감사합니다. 나는 그것에 대해 몰랐습니다. 나는 여전히 [Matt 's suggestion] (http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the-wcf-client-using-block-issue/1424384#1424384)을 더 좋아한다. –

+0

@Allon : 네, 그 제안은 아주 좋은 해결책입니다. 첫 번째 의견을 게시 할 때 찾을 수 없었습니다. 다음은 공식 MSDN 기사입니다 : http://msdn.microsoft.com/en-us/library/aa355056.aspx –