2011-07-05 4 views
1

예외를 비 직렬화하는 데 문제가 있습니다. 네트워크를 통해 예외를 보내는 것은 나쁜 습관이라는 것을 충분히 알고 있지만, 현재 설치에는 시스템 통합을 위해이 작업이 필요합니다.바이너리 포맷터를 사용하여 비 직렬화 한 후 Exception.TargetSite가 null입니다.

서버 시스템은 .net 4 wcf 서비스이고 호출자는 .4 표준 웹 참조를 사용하여 .4를 호출하는 .net 2입니다.

서버 측은 예외를 serialize하고 Base64 문자열로 인코딩합니다. 수신 측

 var formatter = new BinaryFormatter(); 
     messageChannel.ServerException = (Exception) 
     formatter.Deserialize(new MemoryStream(Convert.FromBase64String(base64string))); 

모두에

 var formatter = new BinaryFormatter(); 
     var mem = new MemoryStream(); 
     formatter.Serialize(mem, ex); 
     EncodedException = Convert.ToBase64String(mem.ToArray()); 

는 TargetSite 제외하고있다.

힌트를 주시면 감사하겠습니다.

감사

요한

답변

2

Exception.TargetSite 현재 예외를 발생하는 방법을 취득. MSDN : TargetSite 속성은 예외 처리기가 응용 프로그램 도메인 경계에서 예외를 처리하는 경우 예외가 throw 된 메서드의 이름을 정확하게보고하지 않을 수 있습니다.

expetion의 TargetSite가 원격 코드/응용 프로그램에 존재하는 경우에만 반환 값을 할당 할 수 있으므로 의미가 있습니다 (다른 코드/응용 프로그램 일 수 있기 때문에).

C# 개체의 반사를 네트워크를 통해 직렬화하는 것과 동일한 작업입니다. 반사 된 개체가 원격 사이트에 없더라도 로컬 사이트에서 작동하는 것처럼 작동합니다. 즉, 클래스가없는 클래스의 리플렉션은 아무 것도 아닙니다.