私は、メッセージブローカー(サービスバス)を介して連携して動作する複数のサービス(プロセス)で構成される分散システムに取り組んでいます。これらのサービスの中には時間が非常に敏感なものもあるため、他のすべてのサービスの例外を順番に(データベース/ディスクに)記録するための中心点として使用されるサービスに例外を伝播するという考え方がありましたメッセージの送信がディスクへの書き込みよりも高速であることがわかっているため、サービスに遅延が発生することはありません。したがって、NLogを使用して、バス上で例外を送信するための新しいターゲットを作成し、すべてのサービス例外処理をそのバスにリダイレクトします。C#:型付き例外を別のプロセスに送信する - >基本例外に変換する?
基本的なフレームワークの例外はうまく動作しますが、いくつかの例外はかなり複雑なオブジェクトになることがあります。異なるライブラリを使用する場合、シリアル化可能でない例外(例:IronPython)だけでなく、ExceptionLoggerサービスは他のすべてのエンドポイントで使用されるすべての外部DLLを参照しないため、型付き例外をインスタンス化できません。
は、ここで私は私の問題を解決しなければならなかったいくつかのアイデアですが、どれも仕事:
は他のサービスで使用されるすべてのDLLの例外ロガーサービス参照を持っています。私の意見では、これはきれいで、かなり過剰なものではなく、シリアル化されずにバスに渡されない例外のケースを扱っていません。
データのみを渡すための例外を継承しないカスタムクラスを作成します(Antony Boothメソッドとしてここに:How to serialize an Exception object in C#?)。この問題は、例外ログエンドポイントでこのクラスのインスタンスを受け取り、ログをトリガーしたいときに、NLog LogEventInfoオブジェクトを作成するために、そこから新しいException()を作成できないという問題があります。
バスで送信する前に、特別に型指定された例外を基本の例外型に変換します。このようにして、いくつかの情報は失われますが、私は必要なものすべてであるMessage、Stacktrace、およびInnerExceptionスタックを保持します。残念ながら、私はそれを行う方法を見つけることができず、それが可能であるとは思わない。
これは、私が全体のアイデアの関連性に疑問を抱かせると、私は単に間違った経路に入りますか?
オプション3の問題点を教えてください。必要なのは基本的な 'Exception'プロパティだけですが、なぜこれはあなたのためには機能しませんでしたか? – Mikanikal
例外コンストラクタはパラメータとしてMessageとInnerExceptionを取るだけで、スタックトレースのような他のプロパティはゲッターだけを持ち、設定する方法はありません。 – Dunge
リモートプロセスで例外をキャッチできるようにするには、シリアライズ可能である必要があります。しかし、あなたがやってみたいことがログに記録されていれば、Exception.ToString()を呼び出して、結果の文字列をリモートプロセスに送るのはなぜですか?この文字列には、InnerExceptionおよびStackTrace情報が含まれます。 – Joe