2011-09-04 3 views
2

웹 서비스를 사용할 수 없도록 만드는 웹 서비스에 이상한 오류가 있습니다. 오류를 반환합니다.이 WCF 웹 서비스를 어떻게 디버깅합니까? ("ServiceChannel이 오류 상태 임")

The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.

응용 프로그램 풀을 새로 고치면 오류가 사라집니다. 이미 Log4net을 사용하여 디버깅 로깅을 추가했지만 도움이되는 정보는 표시하지 않습니다.

이벤트 로그에는 아무 것도 없습니다.

이 웹 서비스를 성공적으로 디버깅하려면 어떻게해야합니까? (이 웹 서비스는 2 년 넘게 작동했으며 갑작스러운 오류를 반환하기 시작했습니다)?

이것은 C#/.NET 3.5에 있습니다.

업데이트 : webservice는 SQL Server (고객 데이터)에서 데이터를 가져 와서 데이터 집합으로 래핑 한 다음 다시 클라이언트로 보냅니다.

* 업데이트 2 : * 클라이언트가 연결을 종료하지 못했습니다. 그것은 그럴듯한가?

+1

Jao이이 하나의 중복 질문 : http://stackoverflow.com/questions/530731/how-to-make-sure-you-dont-get-wcf-faulted -state-exception –

+0

using 문을 사용하지 않고 있지만 다른 대답이 도움이 될 수 있습니다 – jao

답변

3

프레임 워크에서 제공하는 System.ServiceModel.MessageLogging 기능을 사용하여 서비스 로깅을 추가 할 수 있습니다. 일반적으로 서비스 계약보다 상위 수준에서 발생하는 모든 내부 WCF 예외를 기록하므로 표준 디버깅을 통해 절대 볼 수 없습니다.

오류가 기록 된 후

는이 .svclog을 검사 할 수 생산 된 수동으로이 기능 날 근본 원인이 사용할 수있는 예외 정보에 따라 결정하는 것이 불가능했다 WCF 문제를 해결하는 데 도움 한 Service Trace Viewer Tool

을 사용하여 분석 클라이언트 또는 서버. 예를 들어 클라이언트에서 원격 호스트에 의해 연결이 끊어졌으며 서버에서 예외가 발생하지 않았을 때 예외 메시지를 생성하는 자격 증명 문제가있었습니다. 서버의 로그를 살펴보면 3 분 안에 정확한 문제가 지적됩니다.

app.config/web에 다음을 추가하십시오.config (필요에 맞게 수정). 이는 구성을 통해서만 가능합니다. 즉, 프로그래밍을 설정할 필요가 없습니다.

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
       <add name="messages" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\logs\messages.svclog" /> 
      </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 

<system.serviceModel> 
    <diagnostics> 
    <messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="false" 
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" 
     maxMessagesToLog="3000" 
     maxSizeOfMessageToLog="2000"/> 
    </diagnostics> 
</system.serviceModel> 

More information found here

1

네트워크 연결 문제 일 수 있습니다. 한번보세요 here

서비스가 응답하는 데 너무 오래 걸릴 수 있습니까? 2 년 동안 일 해왔다는 사실은 데이터가 너무 많아서 서비스가 더 이상 신속하게 쿼리 할 수 ​​없음을 의미 할 수 있습니다.

로컬 컴퓨터에서 실행할 수 있다면 tcp/ip 모니터링 도구를 설치하고 정확한 요청 (및 응답을 얻으면 응답)을 보는 것이 좋습니다.

SOAP 웹 서비스 인 경우 SoapUI를 통해 실행 해보십시오.

몇 가지 생각.

+0

최근 1Mbps에서 20Mbps로 업그레이드했습니다. 문제의 원인이 될 수 있습니까? – jao

+0

가능성이 없습니다. 더 높은 대역폭은 서비스가 응답하는 데 걸리는 시간에는 영향을 미치지 않습니다. 웹 서비스 측의 처리가 아마도 응답하는 데 너무 오래 걸린다는 것을 명심해야합니다. 웹 서비스에 대한 자세한 정보를 게시 할 수 있습니까? –

+0

웹 서비스는 SQL 서버 (고객 데이터)에서 데이터를 가져 와서 데이터 세트로 래핑 한 다음 클라이언트로 다시 보냅니다. – jao

0

서버에서 디버깅하거나 원격 디버거를 연결할 수있는 경우 도구 -> 옵션 -> 디버깅에서 모든 코드 예외 (CTRL-D, E)를 비활성화하십시오. WCF가 throw하는 모든 내부 예외를 catch 할 수 있어야합니다.

하지만 연결을 닫지 않는 클라이언트에 대한 귀하의 의견은 사실로 들립니다. ClientBase의 IDisposable() 구현에 버그가 있습니다 (http://ardalis.com/idisposable-and-wcf 참조).

관련 문제