Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】【Dynamics CRM】Pluginにおけるトレースと例外処理

Dynamics CRM Pluginでの例外処理、例外の確認方法が同期・非同期などで異なるので、その点について確認していきたいと思います。

例外処理結果の違い

Dynamics CRM Pluginで例外をスローすると、同期・非同期で結果の表示方法が違います。

同期であれば、Web アプリケーション ユーザー インターフェイスのダイアログ形式でエラーメッセージが表示されますが

非同期ですとシステムジョブのレコードに記録されます。

実際の表示例は以下のコードの下に記載しています。

例外処理時のメッセージ・ログの記載について

またDynamics CRM SDKでサポートされる例外処理時におけるメッセージ・ログに関しては、大きく分けて2つ存在します。

1つは【InvalidPluginExecutionException】です。

例外をスローする際に【InvalidPluginExecutionException】を利用することで、ダイアログやシステムジョブにメッセージを表示することができます。

もう1つは【ITracingService】です。 IServiceProviderよりインスタンスを取得できるITracingServiceのTraceメソッドを利用することで、Pluginプログラム内部で処理の状況をトレースログとして記録することができます。

メッセージ・ログの注意

ログで注意するべき点として、上記トレースログやメッセージは、同期であれば例外処理が実行された際(処理が失敗した際)にしか確認することができませんし、非同期でも成功時にログを残す設定にしていなければ、失敗時にしか情報を確認することができません。 (成功時のログを残し続けるのもあまりよろしくないでしょう……。)

コード例

以下のコードで実際の出力結果を確認してみたいと思います。

今回は、取引先企業(Account)エンティティのCreateMessageに登録したPluginコードで 【InvalidPluginExecutionException】と【ITracingService】を利用してみました。

フリガナが入力されていなければ、例外処理を行う形になっています。

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace MyProject.Plugin
{
    public class TraceService : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            var trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            trace.Trace("Plugin Trace Start");

            if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity))
                return;

            var inputParameter = (Entity)context.InputParameters["Target"];
            trace.Trace("Set Input Paramter");

            if (!inputParameter.Contains("yominame"))
            {
                trace.Trace("Error!");

                throw new InvalidPluginExecutionException("フリガナを入力して下さい。");
            }
        }
    }
}

実行結果

以下、実行結果です。

■同期の場合の例外

InvalidPluginExecutionExceptionの引数がメッセージとして表示されています。

f:id:sugimomoto:20150416104948p:plain

■非同期の場合の例外

システムジョブの中にInvalidPluginExecutionExceptionの引数がメッセージとして表示されています。

f:id:sugimomoto:20150416104954p:plain

また、以下の様な形でログが出力されています。

ログの下部にITracingServiceで出力したトレースログが記載されていることがわかります。

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: フリガナを入力して下さい。Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220891</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>OperationStatus</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
    </KeyValuePairOfstringanyType>
    <KeyValuePairOfstringanyType>
      <d2p1:key>SubErrorCode</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">-2146233088</d2p1:value>
    </KeyValuePairOfstringanyType>
  </ErrorDetails>
  <Message>フリガナを入力して下さい。</Message>
  <Timestamp>2015-04-16T01:25:18.784068Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>

[MyProject.Plugin: MyProject.Plugin.TraceService]
[dd86ec85-72e2-e411-80d8-c4346bc4ef58: MyProject.Plugin.TraceService: Create of account]

Plugin Trace Start
Set Input Paramter
Error!


</TraceText>
</OrganizationServiceFault>

参考URL

https://msdn.microsoft.com/ja-jp/library/gg334685.aspx