2012-11-28 2 views
0

netTcpBinding을 사용하는 응용 프로그램이 갑자기 작동하지 않는 것으로 나타났습니다. 서비스를 호스팅하는 서버의 이벤트 로그를 검사 후에, 나는 다음과 같은 경고 (많은 사람들의 시리즈 중 하나를) 발견 :maxReceivedMessageSize에 의한 WCF TimeoutException

예외 정보 : 예외 형식 : 완전한 오픈 작업을하지 않았다 예외 메시지 TimeoutException 할당 된 시간 초과는 00:01:00입니다. 이 작업에 할당 된 시간은 일 수 있습니다.

서버 스택 추적 : System.ServiceModel.Channels.ServiceChannel에서 System.ServiceModel.Channels.CommunicationObject.Open (시간 범위 시간 초과)에서 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen (시간 범위 시간 초과)에서. 의 OnOpen (타임 아웃 시간 범위)에서 System.ServiceModel.Channels System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (시간 범위 초과, CallOnceManager 캐스케이드)에서 System.ServiceModel.Channels.CommunicationObject.Open (시간 범위 초과)에서
.ServiceChannel.EnsureOpened (TimeSpanSystem.ServiceModel.Channels.ServiceChannel.Call (문자열에서 17,451,515,시간 초과) 작용 부울 일방은 ProxyOperationRuntime 동작 ( System.ServiceModel.Channels.ServiceChannelProxy.InvokeService에서 [] 인, 개체 [] 아웃, 타임 스팬 타임 아웃) 개체 나의 새로운 바인딩 외모 때문에 System.ServiceModel.Channels.ServiceChannelProxy.Invoke (iMessage를 메시지)

문제를 해결하려면에서 IMethodCallMessage methodCall을, ProxyOperationRuntime 동작을), 나는 10 maxReceivedMessageSize의 크기를 증가했다 좋아요 :

> <netTcpBinding> 
>  <binding name="largeBufferNetTcpBinding" listenBacklog="100" maxBufferSize="519730000" maxConnections="100" 
>    maxReceivedMessageSize="519730000" portSharingEnabled="true"> 
>  <readerQuotas maxArrayLength="519730000"/> 
>  <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
>  <security> 
>   <message clientCredentialType="Windows"/> 
>  </security> 
>  </binding> 
>  <binding name="defaultNetTcpBinding" portSharingEnabled="true"/> 
>  <binding name="defaultNetTcpMexBinding" portSharingEnabled="true"> 
>  <security mode="None"/> 
>  </binding>  </netTcpBinding> 

maxReceivedMessageSize가 위에 표시된 TimeoutException과 어떻게 관련되는지 이해할 수 없습니다. 이 문제를 더욱 해결하고 서비스의 안정성을 높이려면 어떻게해야합니까?

+0

매우 느린 네트워크를 사용하지 않는 한 개인적으로 어떻게 연결되는지는 알 수 없습니다. 사용할 수있는 코드에서 어떤 방법으로 추적합니까? – ChrisBint

+0

우리는 우리의 서비스를 추적하고있다. 그러나 WCF/.NET에 의해 오류가 던져지기조차하지 못한다. – laconicdev

답변

1

하드 말할 정확히 문제의 정보를 기반으로 클라이언트/서비스의 상호 작용에 어떤 일이 일어나고 있지만 시도 할 수있는 몇 가지 것들의 새로운 기능 :

첫째, 모든 변경 다시 기본값으로 519730000로 설정 maxReceivedMessageSize는 2 - 3MB의 범위에서 설정해야합니다 (메시지 크기 예외가 사라질 때까지 &에서 시작 함).

그래도 문제가 해결되지 않으면이 테스트의 서비스와 클라이언트에서 모두 netTcpBinding 대신 basicHttpBinding으로 설정을 변경하고 설정을 변경하지 마십시오. 이 바인딩 변경이 작동하면 WCF 클라이언트 인스턴스 (ClientBase 또는 채널 ChannelFactory)를 제대로 처리하지 못했을 가능성이 큽니다. netTcpBinding은 세션에 따라 다르며 클라이언트 인스턴스가 올바르게 처리되지 않으면 코드는 서비스 & 클라이언트에서 효율적으로 TCP 리소스를 해제하지 않습니다. BTW : funkiness of the WCF Dispose implementation 때문에 using에 클라이언트 인스턴스를 래핑하는 것이 올바른 방법이 아닙니다.

호출에 여전히 시간 초과가있는 경우 잘못된 TCP & 클라이언트 구성을 제거하고 서비스 구현의 코드 성능에 중점을 두어야합니다.

+0

나는 코드를 파헤 치면서 한 가지 방법으로 프록시 주위에 "using {}"문을 사용하는 반면 다른 하나는 프록시를 "닫으려고"시도하지 않는 것을 발견했습니다. 이것이 이것이 문제 였기를 바랍니다. try/catch/abort 패러다임으로 메소드를 수정하고 더 많은 테스트를 수행 할 것입니다. – laconicdev

+0

좋아요! 나는'netTcpBinding'을 사용하면 클라이언트/서비스 자원 관리 코드가 매우 깨끗하다는 것을 알았습니다. 그렇지 않으면 푸딩의 증거와 같은 문제가 생길 수 있기 때문입니다. WCF 일회용 문제에 대해 논의하는 게시물 링크를 추가했습니다. 처음에 추가하지 못해 죄송합니다. 만날 회의가있었습니다. 감사! –

관련 문제