WCF サービスと通信する Windows サービスがあります。WCF サービスはすべてフォールト シールドされており、カスタムの UserFaultContract と ServiceFaultContract を生成します。問題ありません。
Windows サービスでは、例外処理とログ記録に EntLib を使用しています。
フォールトのキャッチを試みたくない
try
{
}
catch (FaultException<UserFaultContract>)
{
}
EntLib を使いたい
try
{
}
catch (Exception ex)
{
var rethrow = ExceptionPolicy.HandleException(ex, "Transaction Policy");
if (rethrow) throw;
}
これも機能しますが、私の Tranasaction ポリシーでは、UserFaultContract の詳細をログに記録したいと考えています。これは私が接着されていないところです。そして、私は接着剤がばらばらになるのが嫌いです。障害はキャプチャされてログに記録されますが、障害の詳細を取得できません。
私の例外ポリシーは
<add name="Transaction Policy">
<exceptionTypes>
<add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="None" name="Exception">
<exceptionHandlers>
<add logCategory="General" eventId="200" severity="Error" title="Transaction Error"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
priority="2" useDefaultLogger="true" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Logging Handler" />
</exceptionHandlers>
</add>
<add type="System.ServiceModel.FaultException, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="None" name="FaultException">
<exceptionHandlers>
<add logCategory="General" eventId="200" severity="Error" title="Service Fault"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
priority="2" useDefaultLogger="true" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="Logging Handler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
ログに記録された例外は次のとおりです。
タイムスタンプ: 5/13/2010 14:53:40 メッセージ: HandlingInstanceID: e9038634-e16e-4d87-ab1e-92379431838b
タイプ 'System.ServiceModel.FaultException`1[[LCI.DispatchMaster.FaultContracts.ServiceFaultContract, LCI.DispatchMaster.FaultContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' の例外が発生し、キャッチされました。
2010 年 5 月 13 日 10:53:40 タイプ: System.ServiceModel.FaultException`1[[LCI.DispatchMaster.FaultContracts.ServiceFaultContract、LCI.DispatchMaster.FaultContracts、バージョン = 1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null]] 、System.ServiceModel、Version=3.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089 メッセージ : DispatchMaster サービスで内部エラーが発生しました。ソース: mscorlib ヘルプ リンク: 詳細: LCI.DispatchMaster.FaultContracts.ServiceFaultContract アクション: http://LCI.DispatchMaster.LogicalChoices.com/ITruckMasterService/MergeScenarioServiceFaultContractFault コード: System.ServiceModel.FaultCode 理由: DispatchMaster サービスで内部エラーが発生しました。データ: System.Collections.ListDictionaryInternal TargetSite: Void HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage) スタック トレース:
障害連絡先には、ID とメッセージがあります。ご覧のとおり、ID とメッセージが EntLib によってログに記録されるようにします。
障害の詳細を抽出するためにカスタム ハンドラーを作成する必要があると想定していますが、そのタスクを回避するのに役立つ可能性がある EntLib に何かが欠けているかどうかを尋ねたいと思いました。
喜んで助けてくれる人に感謝します。