내 서비스 대신에 표준 에러 나눠 있습니다낮은 수준의 WCF 오류를 처리하는 방법은 무엇입니까?
- 내가 IErrorHandler 서비스를 실행하는 동안 예기치 않은 오류를 처리 할 수있는 서비스에 매여있다.
- 예상되는 경우를 처리하기 위해 모든 서비스 방법에서 try/catch 블록을 사용했습니다.
그러나 서버에서 예외가 발생하고 어느 것도 호출되지 않는 경우가 있습니다.
- 5 초 결합 서버에 receiveTimout 설정 : 여기 서버 예외가 IErrorHandler로 전송되지 않는 경우이다.
: 클라이언트에
Service1Client sc = new Service1Client();
ICommunicationObject o = sc as ICommunicationObject;
o.Open(); // open channel
sc.GetData(10); // do a first call
Thread.Sleep(10000); // wait longer than the server receiveTimeout
sc.GetData(10); // Attempt another call: server throws a FaulException
이 경우 서버에서 오류가 발생하지만 처리 할 수있는 방법을 찾을 수 없습니다. 서버 프로세스에 디버거를 연결하고 모든 예외를 중단하면 디버거가 중단되므로 오류가 발생합니다.
낮은 수준의 오류가 내 프로그램에 전달되지 않는 다른 유사한 사례를 발견했습니다.
클라이언트 응용 프로그램에 반환되기 전에 서버에서 발생하는 모든 예외를 처리 할 수 있도록 코드를 연결할 수 있습니까? 나 자신의 IChannel 또는 다른 저수준 인터페이스를 구현해야합니까?
감사
UPDATE 2009년 9월 21일은 Microsoft WCF 포럼에 this 스레드를 참조하십시오. 이런 유형의 예외를 처리하려면 아마도 자체 채널을 구현해야 할 것입니다. 나는 더 많은 정보가있을 때이 게시물을 다시 업데이트 할 것이다.
receiveTimeout 서버 바인딩은 여기에 있지 않아야합니다. GetData() 호출로부터 응답을 수신하는 데 5 초 이상 걸리는 경우에만 해당됩니다. 10 초 동안 잠자고있는 클라이언트는 효과가 없습니다. 초기 테스트 서비스가 있고 서버 바인딩을 업데이트하여 receiveTimeout을 5 초로 설정한다고 가정하면 문제가 재현되지 않습니다. 고객에게받은 수신 오류는 무엇입니까? 실제로 코드에서 서비스를 중단하지 않는 경우 서버 바인딩/동작이 잘못 구성된 것으로 의심됩니다. 클라이언트/서비스에서 WCF 디버깅을 활성화하고 그 내용을 확인하십시오. –
MSDN에서 설명한대로 서버 receiveTimeout은 서버가 유휴 열린 채널을 기다리는 최대 시간입니다. 이 경우 시간이 초과됩니다. 클라이언트의 예외는 내부 FautException이있는 MessageSecurityException입니다. 내부 FaultException은 receiveTimeout이 초과되었음을 나타냅니다. – Sylvain
흥미 롭습니다. 나는 이것이 왜 첫 번째 호출에서 작동하고 두 번째 호출에서 작동하지 않는지에 대한 단서가 될 수도 있다고 생각합니다. receiveTimeout에 대한 참조 문서를 링크 할 수 있습니까? 나는이 가치에 대한 나의 이해가 결함이 있다고 생각한다. 내가 참조하는 문서는 http://msdn.microsoft.com/en-us/library/ms731299입니다.aspx, 고마워! –