2010-01-13 2 views
1

Windows 서비스에서 호스팅하는 WCF 서비스를 실행하고 있습니다 (asp.net 사이트에서 호출).WCF 서비스에서 "응답을 기다리는 동안 요청 채널 시간이 초과되었습니다"

"요청 채널이 기다리는 동안 시간 초과 :합니다 (sendTimeout 속성이 초과 되었기 때문에)는"BasicHttp "엔드 포인트를 통해 호출하는 동안 내가 타임 아웃을 얻을 때

, 나는 예상되는 오류 메시지 . ... 0시 1분 0초 후 "

을하지만 (전송 보안)를 NetTcp 엔드 포인트를 통해 호출 할 때 나는 더 일반적인 오류 얻을 :

"답장 통신 개체, System.Ser를 viceModel.Channels.ServiceChannel은 오류 상태이므로 통신에 사용할 수 없습니다. "

아무도 왜 그런지 알고 있습니까? 구성에서 뭔가가 누락 되었습니까?

내 클라이언트 측 구성은 다음과 같습니다

<netTcpBinding> 
      <binding name="netTcpBindingConfig" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:10" 
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
      maxBufferPoolSize="524288" maxBufferSize="655360" maxConnections="10" 
      maxReceivedMessageSize="65536000"> 
       <readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </netTcpBinding> 


     <basicHttpBinding> 

      <binding name="basicHttpBindingConfig" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:00:00.500" 
       bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536000" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="65536000" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 

     </basicHttpBinding> 

서비스 설정 : 어떤 도움이 많이 감사합니다

<basicHttpBinding> 
     <binding name="basicHttpBinding_config" maxReceivedMessageSize="5000000"> 
     <readerQuotas maxDepth="9000000" maxStringContentLength="9000000" 
     maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" /> 
     </binding> 
    </basicHttpBinding> 

    <netTcpBinding> 
     <binding name="tcpBinding_config" maxReceivedMessageSize="5000000" maxBufferSize="5000000" maxBufferPoolSize="5000000" > 
     <readerQuotas maxDepth="9000000" maxStringContentLength="9000000" 
      maxArrayLength="9000000" maxBytesPerRead="9000000" maxNameTableCharCount="9000000" /> 
     </binding> 
    </netTcpBinding> 

! 감사합니다.

답변

2

시간 초과 예외는 오류 상태에 들어갈 프록시를 일으키는 것입니다.

BasicHttpBinding을 사용하여이 예외가 발생하지 않는 이유는이 바인딩이 세션을 사용하지 않기 때문입니다. 세션을 사용하는 바인딩에 예외가 있으면 채널에 오류가 발생하고 세션이 파괴됩니다.

이것은 실제 문제의 원인을 숨기는 경향이 있습니다. 원래 예외를 조사하는 한 가지 방법은 WCF 추적을 사용하는 것입니다.

WCF는 작업 호출, 코드 예외, 경고 및 기타 중요한 처리 이벤트와 같은 응용 프로그램의 모든 구성 요소에서 프로세스 중요 시점에 대한 추적을 출력하도록 구성 할 수 있습니다.

다음은 추적을 사용하는 .config 예제입니다.

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" > 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 

     <source name="myUserTraceSource" switchValue="Warning, ActivityTracing"> 
     <listeners> 
      <add name="xml"/> 
     </listeners> 
     </source> 
    </sources> 

    <sharedListeners> 
     <add name="xml" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="C:\logs\TraceLog.svclog" /> 
    </sharedListeners> 

    </system.diagnostics> 
</configuration> 

initializeData에 정의 된 경로가 서비스에서 쓰기 가능해야합니다. MSDN: Configuring Tracing에서 WCF 추적에 대해 자세히 읽을 수 있습니다.

Microsoft는 Service Trace Viewer Tool을 사용하여 .svclog 파일을 읽습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 대니얼! 이것은 내가 찾던 해결책이 아니므로 더 궁금한 점이 많습니다. 내 클라이언트 응용 프로그램 (ASP.NET 사이트)에서 WCF 서비스와의 통신에 실패 할 때 오류가 발생합니다. 내가 (디버그 동안) 타임 아웃 시나리오를 발생 시키면 BasicHttp 바인딩을 실행할 때 TimeoutException을 수신하지만 NetTcp 바인딩으로 전환하면 (다른 모든 것을 일정하게 유지), "Faultet State"예외가 발생합니다. 그래서 무엇이 오류 (즉, 타임 아웃)를 일으키는 지 알고 있습니다. NetTcp 바인딩이이를보고하지 않는 이유는 무엇입니까? Jon –

+0

BasicHttpBinding을 사용하여이 예외가 발생하지 않는 이유는이 바인딩이 세션을 사용하지 않기 때문입니다. 세션을 사용하는 바인딩에 예외가 있으면 채널에 오류가 발생하고 세션이 파괴됩니다. –

+0

좋아, 그래서 요점을 되풀이하다; NetTcp 바인딩을 사용할 때 채널에서 Timeout Exception을 잡을 수 없습니까? NetTcp 바인딩에서 세션을 사용 불가능하게하기 위해 엔드 포인트/서비스 구성에서 할 수있는 것이 있습니까? (세션이 필요 없기 때문에이 옵션이 유용 할 수 있습니다.) –