Dynamics CRM 2011 SDK Web サービス利用時のベストプラクティス

みなさん、こんにちは。

本日は開発者向けの情報として、組織サービス利用時の認証に関する
情報と、ベストプラクティスを紹介します。

Microsoft Dynamics CRM 2011 の認証

それぞれの環境で以下の認証をサポートしています。

Microsoft Dynamics CRM オンライン
クレーム認証、およびフェデレーションを利用した Active Directory 認証
※ フェデレーションは Office 365 環境のみ

Microsoft Dynamics CRM 2011 設置型および IFD
クレーム認証、および Active Directory 認証

クレーム認証の仕組み

ユーザーはセキュリティトークンサービス (STS) で認証を行い、STS は
暗号化された SAML トークンを発行します。トークンにはライフタイムが
存在し、一定期間で期限が切れるため、更新作業が必要になります。

Active Directory 認証の仕組み

ユーザーは Active Directory で認証され、 SDK を利用した API 呼び出し
では、Windows Communication Service (WCF) のスタックが認証を、
Web アプリケーションの呼び出しでは Internet Information Services が
認証をハンドルします。

Client Proxy クラスを利用した認証

Microsoft Dynamics CRM Web サービスに対する認証を行う方法の
1 つとして、 OrganizationServiceProxy と DiscoveryServiceProxy を
利用する方法があります。これらのクラスは、オンライン、設置型、IFD
すべてに対して機能します。 Client Proxy クラスは、クレーム認証
および Active Directory 認証に対応します。

以下のコードは組織サービスを作成するために利用できます。

using (OrganizationServiceProxy _serviceProxy = new OrganizationServiceProxy(
organizationUri, homeRealmUri, userCredentials, deviceCredentials))

また以下のコードでは探索サービスを作成できます。

using (DiscoveryServiceProxy _discProxy = new DiscoveryServiceProxy(
organizationUri, homeRealmUri, userCredentials, deviceCredentials))

Client Proxy クラスはアプリケーションを終了する間に破棄する必要が
あります。 using ステートメント内で利用することでスコープから出た際に、
クラスが破棄されることを保障します。

上記以外に Client Proxy を生成する方法は、ヘルパークラスを利用する
方法です。以下のコードは、多くのサンプルで利用されています。

OrganizationServiceProxy _serviceProxy =
ServerConnection.GetOrganizationProxy(serverConfig)

Client Proxy クラスの保持

上記のとおり、Client Proxy クラスはアプリケーションの終了前には
破棄する必要がありますが、パフォーマンスを考慮した場合、無駄に
破棄することなく、極力保持することが望ましいです。

主な理由は、Web サービスに対するチャネルの確立と認証には、
比較的大きなコストがかかることにあり、Client Proxy クラスはその
認証を保持することが出来るからです。この場合、作成した Client
Proxy クラスは、アプリケーションの終了前に、明示的に Dispose を
呼び出し破棄する必要があります。

簡単な検証

今回、エラー処理等一切考慮しない、非常にシンプルなプログラムを
2 つ作成しました。1 つはレコードを作成する度に Client Proxy を破棄
するプログラム A と、 Client Proxy をアプリケーション起動時に生成し
レコード作成中は保持しておき、最後に破棄するプログラム B です。
それぞれ取引先企業を 1000 件作成します。

キャッシュやパフォーマンスのばらつきを考慮して、それぞれ複数回
実行してみました。

プログラム A プログラム B
1 回目 74 秒 19 秒
2 回目 65 秒 16 秒
3 回目 59 秒 14 秒
4 回目 60 秒 18 秒
5 回目 58 秒 14 秒

また 5000 件レコードを作成した場合の結果です。時間がかかるため
一度だけ計測しました。

プログラム A プログラム B
1 回目 281 秒 93 秒

※ この検証は Microsoft Dynamics CRM 2011 が 1 秒間に何件
レコードを作成できるかという観点ではなく、2 つのプログラムの
比較用です。実際のパフォーマンスは作成するレコードの内容、
プラグイン、ワークフロー、関連、重複チェック等、複数の要素が
影響しますので、ご注意ください。

まとめ

今回は Client Proxy クラスを利用したベストプラクティスを紹介
しましたが、実際にはより多くの要素を考慮する必要があります。
現在のカスタムアプリケーションのパフォーマンスに問題を感じる
場合は、是非こちらの情報も参考にしてみてください。

完全な情報は SDK をご参照ください。(英語)
https://msdn.microsoft.com/en-us/library/gg334502

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