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 サポート 中村 憲一郎