2012-03-05 1 views
2

로 잡은, 나는 그것을 잡기입니다 내가 FaultException<ArgumentException>,을 잡을 수 있어요으로이WCF 오류 예외 <SQLEXCEPTION> 나는 내가 <strong>SQLEXCEPTION</strong> 잡기 다음이</p> <pre><code>throw new FaultException<SqlException>(...); </code></pre> <p>같은 오류 예외로 그리고 클라이언트 측에 반환하고 WCF 서비스를 CommunicationException

catch (FaultException<SqlException> e) 
{ 
    // do something with exception 
} 
catch (FaultException<Exception> e) 
{ 
    // do something with exception 
} 

처럼 나는 서비스 측 또는 클라이언트 측 (A의 WinForm 클라이언트)에서의 app.config 내 Web.config의 문제를 생각하지 않는다 등,하지만 FaultException<SqlException>

나는 내 작업 계약이 제대로 [FaultContract(typeof(SqlException))] 같은 것들로 구성되어 클라이언트로 다운 된 SQLException을 통과 할 수 없다는 아무것도 발견하지 않았습니다, 그리고 [FaultContract(typeof(Exception))]

누구나 볼이 나 내가 SqlException 유형의 오류를 클라이언트에 전달할 수 없다는 사실을 알고 있습니까? 고맙습니다.

+0

죄송 비주얼 스튜디오의 이상한 유물 아마이었다 그래서이 발생하지 말았어야. 나는 당신이 클라이언트에게 stacktrace를 다시 보낼 수 있다고 생각하지 않는다. – Asdfg

답변

3

throw new FaultException<Exception>은 실제로 WCF 결함 시스템이 사용되는 방법이 아닙니다. 지정한 유형은 SOAP 오류의 <Detail> 요소에서 와이어를 통해 직렬화됩니다. 일반적으로이 유형은 작성하는 WCF 데이터 계약 클래스입니다 (예 : Exception[Serializable], 그리고 DataContractSerializer[Serializable] 유형뿐만 아니라 [DataContract] 유형을 처리 할 수 ​​있기 때문에

[DataContract] 
public class MyFault { 
    [DataMember] 
    public string Message {get; set;} 
} 

throw new FaultException<Exception>

작동 발생합니다.

그러나이 접근에는 심각한 한계가 있습니다. DataContractSerializer[Serializable] 유형을 잘 처리하지 못합니다. 기본 유형 (string, int 등)의 필드 만 올바르게 전송됩니다. 그것은 매우 간단한 예외 유형에 대해서는 거의 OK이지만, SqlException과 같은 복잡한 유형의 경우에는 충분하지 않습니다.

내 제안 된 솔루션은 : 자신 만의 전용 데이터 계약을 만들어서 SqlException의 데이터를 전달한 다음 대신 보내십시오. 사실, 모든 예외 유형에 대해 이렇게하십시오. 더 안전하고 더 나은 방법입니다. 나는 이것을 자동으로 처리하기 위해 Enterprise Library Exception Shielding을 사용한다. 클라이언트로 다시 전달되는 모든 것은 서버 로그의 오류 데이터를 식별하는 단일 GUID 값입니다.

예외 경로를 결정할 경우 this detailed article을 참조하십시오.

0

잘못된 위치에 중단 점이 있기 때문에이 문제가 발생했습니다. Debug..Delete all Breakpoints (Ctrl-Alt-F9)으로 모든 중단 점을 제거하고 모든 CommunicationException 예외가 사라지고 올바른 메시지가 다시 수신되었습니다.

예, 제한 시간은 60 초입니다, 그래서 이전 코멘트 ABT 2012