Microsoft Dynamics CRM : Azure 連携用のカスタムプラグイン開発

みなさん、こんにちは。

今回も開発者の方向けの情報として、前回紹介した Azure 連携サンプル
続く情報を提供します。以下は前回の記事のサンプルを実行した状態まで
設定が終わっている前提とします。

Azure 連携とプラグイン

前回、Windows Azure サービスバスに対して操作コンテキストを送信する
サンプルを紹介しましたが、その際は既定のプラグインを利用しました。
しかし、要件によっては既定のプラグインが送信する情報では不十分な
場合があります。

そこで Azure 連携で利用できるカスタムプラグインの開発を紹介します。

カスタムプラグインサンプル

以下の手順でカスタマプラグインのサンプルをコンパイル、登録します。

1. Visual Studio で sdk\samplecode\cs\azure\windowsazure.sln を
開きます。

2. ソリューションエクスプローラーより Plug-ins プロジェクトを右クリックし
ビルドをクリックします。コンパイルが成功することを確認します。

3. SDK\bin\PluginRegistrationTool.exe を実行します。

4. 必要な情報を入力して、組織に接続します。既に ServiceEndpoint
が登録されていることを確認します。

image

登録がない場合、前回の記事のステップを一通り実行してください。
すでに登録がある場合画面のように選択後、右側に出る ServiceEndpointId を
控えてください。

image

5. Register | Register New Assembly をクリックします。

6. コンパイルしたプラグインを選択し、”Sandbox" に登録します。

7. 登録したプラグインを展開し、ステップを追加します。

image

8. 今回も前回同様、レターの作成にステップを登録します。ただし
今回は Unsecure Configuration に先ほど記録した ID を登録します。

image

またここでは同期処理に設定を行いました。

9. Register New Step ボタンをクリックして登録を完了します。

10. ServiceEndpoint に直接登録したステップは無効にしておきます。

image

ここでコードの中身を確認してきます。

コンストラクタ

プラグインコンストラクタを利用して、ServiceEndpointId を取得しています。
このため上記手順で Unsecure Configuration に ID を渡す必要がありました。

public SandboxPlugin(string config)
{
    if (String.IsNullOrEmpty(config) || !Guid.TryParse(config, out serviceEndpointId))
    {
        throw new InvalidPluginExecutionException("Service endpoint ID should be passed as config.");
    }
}

実際の処理

コメントを入れてみました。

public void Execute(IServiceProvider serviceProvider)
{
    // 実行コンテキストの取得。通常のプラグインと同じ。
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    // トレースサービスの作成。通常のプラグインと同じ。
    ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    if (tracingService == null)
        throw new InvalidPluginExecutionException("Failed to retrieve the tracing service.");

    // Azure へのエンドポイントを作成。ここが通常と異なる点。
    IServiceEndpointNotificationService cloudService = (IServiceEndpointNotificationService)serviceProvider.GetService(typeof(IServiceEndpointNotificationService));
    if (cloudService == null)
        throw new InvalidPluginExecutionException("Failed to retrieve the service bus service.");

    try
    {
        tracingService.Trace("Posting the execution context.");
        // Azureエンドポイントの Execute メソッドを実行して、コンテキスト情報を送付。
        string response = cloudService.Execute(new EntityReference("serviceendpoint", serviceEndpointId), context);
        // 応答メッセージで状況確認
        if (!String.IsNullOrEmpty(response))
        {
            tracingService.Trace("Response = {0}", response);
        }
        tracingService.Trace("Done.");
    }
    catch (Exception e)
    {
        tracingService.Trace("Exception: {0}", e.ToString());
        throw;
    }
}

サンプルプログラムの実行

最後に MyQueue サンプルを実行し、サービスバスで情報を待ち受けます。

1. Visual Studio の画面に戻ります。

2. ソリューションエクスプローラーより PersistentQueueListener を
右クリックして、スターとアッププロジェクトに設定を選択します。

3. F5 を押下してアプリケーションを開始します。

4. サービスバスの名前空間、発行者名、アクセスキーを聞かれるので
順次入力します。

5. Press [Enter] to retrieve a message from the queue と出たら成功です。

動作確認

では実際に動かしてみましょう。

1. Microsoft Dynamics CRM Online でレターを作成します。

2. 今回は同期処理ですので、エラーがあればその場でエラーが
ポップアップし、処理が中断されます。

3. レコードの作成が完了した時点で、Visual Studio で起動している
アプリケーションに戻ります。

4. 画面上で Enter キーを押下して、画面上に情報が出るか確認します。

まとめ

今回のサンプルでは、既定のプラグインと同様にただ操作コンテキストを
送信していますが、実際にはコンテキストに情報を付与して渡すなどの
処理が行えます。

既定のプラグインで物足りない場合には是非試してください。

- Dynamics CRM サポート 中村 憲一郎