【发布时间】:2011-02-03 16:25:11
【问题描述】:
我有一个使用 WCF 和命名管道的简单 IPC 机制。我的目标是将异常详细信息(包括堆栈跟踪)传播到客户端以进行日志记录(应用程序日志记录的其余部分位于客户端上)。
如果我使用以下代码,我可以在客户端捕获 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) { }
}
将 IService.DoSomething 上的 FaultContract 更改为
typeof(MyException).
将Service中的throw子句改为
new FaultException<MyException>(new MyException(e.Message, e);
将客户端中的catch子句改为
catch (FaultException<MyException> e)
当我执行此操作时,客户端会捕获一个 CommunicationException 并出现错误: System.ServiceModel.CommunicationException:从管道读取错误:管道已结束。 (109, 0x6d)。
MyException 类位于客户端和服务器均可使用的共享库中。
这个问题与this question 非常相似,但这对我没有帮助。
【问题讨论】:
标签: wcf stack-trace named-pipes faultexception