У меня есть простой механизм IPC, который использует WCF и именованные каналы.Моя цель - передать подробности исключений (включая трассировку стека) клиенту для целей ведения журнала (остальная часть ведения журнала приложения находится на клиенте).
Если я использую следующий код, я могу перехватить FaultException на клиенте и смотрите детали исключения:
Контракт:
[ServiceContract]
public interface IService
{
[OperationContract]
[FaultContract(typeof(Exception))]
void DoSomething();
}
Реализация:
public class Service : IService
{
public void DoSomething()
{
try
{
ThisWillThrowAnException();
}
catch (Exception e)
{
throw new FaultException<Exception>(e);
}
}
}
Клиент:
public void CallServer()
{
try
{
proxy.DoSomething();
}
catch (FaultException<Exception> e)
{
Console.WriteLine("Caught fault exception!");
}
}
Это работает нормально, и я вижу сообщение, напечатанное на консоли.Однако, если я хочу использовать собственное производное исключение вместо базового класса Exception, оно завершится неудачей.
Настраиваемое исключение:
[Serializable]
public class MyException : Exception
{
public MyException () { }
public MyException (string message) : base(message) { }
public MyException (string message, Exception inner) : base(message, inner) { }
protected MyException (
SerializationInfo info,
StreamingContext context)
: base(info, context) { }
}
Измените FaultContract на IService.DoSomething на
typeof(MyException).
Измените предложение throw в Service на
new FaultException<MyException>(new MyException(e.Message, e);
Измените предложение catch в клиенте на
catch (FaultException<MyException> e)
Когда я выполняю это, CommunicationException перехватывается наклиент с ошибкой: System.ServiceModel.CommunicationException: при чтении из канала произошла ошибка: канал завершен.(109, 0x6d).
Класс MyException находится в общей библиотеке, доступной как для клиента, так и для сервера.
Этот вопрос очень похож на этот вопрос , но это мне не помогло.