WCFと名前付きパイプを使用する単純なIPCメカニズムがあります。私の目標は、ロギングの目的で例外の詳細(スタックトレースを含む)をクライアントに伝達することです(残りのアプリケーションロギングはクライアントにあります)。
次のコードを使用すると、クライアントでFaultException <Exception>をキャッチし、例外の詳細を確認できます。
契約:
[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クラスは、クライアントとサーバーの両方で使用できる共有ライブラリにあります。
この質問はこの質問と非常に似ていますが、それは私を助けませんでした。