我有一個簡單的IPC機制,使用WCF和命名管道。我的目標是將異常詳細信息(包括堆棧跟蹤)傳播到客戶端以進行日誌記錄(其餘應用程序日誌記錄位於客戶端上)。WCF FaultContract失敗NamedPipe
如果我使用下面的代碼,我能趕上在客戶端上的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).
變化服務扔子句
new FaultException<MyException>(new MyException(e.Message, e);
更改客戶端的catch子句到
catch (FaultException<MyException> e)
當我執行此操作時,在客戶端上發生CommunicationException並出現以下錯誤: System.ServiceModel.CommunicationException:從管道讀取時發生錯誤:管道已結束。 (109,0x6d)。
MyException類位於共享庫中,可供客戶端和服務器使用。
這個問題與this question非常相似,但這並沒有幫助我。