Compartilhar via


Dynamics CRM 2011 サンドボックス処理サービス プラグインからの Web アクセス

みなさん、こんにちは。

前回に引き続きサンドボックス処理サービスのトピックをお届けします。
今回はサンドボックスに登録したプラグインから、Web アクセスを行う
サンプルの紹介です。早速見ていきましょう。

隔離されたプラグインからの Web アクセスサンプル

サンプルは以下のフォルダにあります。

samplecode\cs\plug-ins\webclientplugin.cs

1. Visual Studio 2010 を開きます。

2. ファイル | 開くより以下のソリューションを開きます。このソリューション
は、複数のプラグインサンプルを含みます。

samplecode\cs\plug-ins\plug-ins.sln

webclientplugin.cs

今回利用するサンプルは webclientplugin.cs です。ソリューション
エクスプローラーから webclientplugin.cs を開きます。重要な箇所は
以下の 2 点です。

‐ コンストラクタを利用してアクセスする URL を渡す。
‐ WebClient クラスを利用して Web にアクセスする。

コンストラクタ部分

string 型の引数を 1 つだけ取るコンストラクタが定義されています。 引数が
1 つの場合は、Plugin Registation Tool の Unsecure Configuration の
文字列を受け取ることが可能です。

※パフォーマンスのためプラグインはキャッシュされます。そのために
コンストラクタは毎回呼ばれない可能性があります。いずれにしても
Plugin Registration Tool から値を設定するため、固定の URL となります
ので、動的な URL が必要な場合は、プラグインをトリガーするエンティティ
にカスタムフィールドを作成し、そこにいれた URL を渡す等の工夫が
必要になります。

public WebClientPlugin(string config)
{
    if (String.IsNullOrEmpty(config))
    {
        webAddress = "https://www.bing.com";
    }
    else
    {
        webAddress = config;
    }
}

値が渡されなかった場合は Bing につながるようになっています。

Web アクセス部分

Web アクセス部分では、WebClient を利用して、HTTP 通信を行います。

// WebClient クラスの作成
using (WebClient client = new WebClient())
{
    // web アドレスを渡してレスポンスを取得
    byte[] responseBytes = client.DownloadData(webAddress);
    // レスポンスを文字列に変換
    string response = Encoding.UTF8.GetString(responseBytes);
    // トレースサービスを利用して文字列を記録
    tracingService.Trace(response);

    // トレースはエラー発生時にしか残らないため、あえてエラーを出す
    throw new InvalidPluginExecutionException("WebClientPlugin completed successfully.");
}

プラグインの登録と検証

1. 上記でサンプルを、ビルド | ソリューションのビルドよりコンパイルします。

2. Plugin Registration Tool より、コンパイルされた SamplePlugins.dll を
任意の組織に登録します。ツールの利用方法は前回の記事にステップが
あります。

image

3. 今回はテストとして Account の Create メッセージに登録しました。

image

4. Internet Explorer で Dynamics CRM 2011 に接続し、ワークプレース | 取引先企業
より新規にレコードを作成します。以下のメッセージが出ることを確認します。

image

5. エラー確認後、エラー画面より 「ログ ファイルのダウンロード」 をクリックします。

6. ダウンロードされたログに、bing.com のページの情報があれば成功です。

7. 次に、アクセスする URL を変更してみます。Plugin Registration Tool に
戻り、ステップを変更します。

image

8. ステップ更新の画面で、右側テキストボックスの 2 段目に
接続したい URL を入力します。

image

9. Update をクリック後、再度取引先企業を作成して、エラーを確認します。

10. ダウンロードしたログに CRM チームのブログ内容が表示されていれば
成功です。 Trace に出力する文字数の問題で response の内容が途切れて
いる場合がありますが、コード内には全ての HTML 情報が返ってきています。

アクセスできるサイトの設定

既定では HTTP および HTTPS に対する Web アクセスが許可されていますが、
セキュリティのため変更したい場合には、以下の手順で変更が可能です。

1. Dynamics CRM サーバー上でレジストリエディターを開きます。

2. 以下のパスに移動します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM

3. 以下の項目が無い場合は、文字列値として以下の項目を追加します。
※名前の最後にスペースが入らないように注意してください。

SandboxWorkerOutboundUriPattern

4. アクセスできるアドレスを正規表現で指定します。既定では以下の
正規表現が設定されています。作成した文字列値をダブルクリックし、
値のデータの以下の文字列を貼り付けます。

"^http[s]?://(?!((localhost[:/])|(\[.*\])|([0-9]+[:/])|(0x[0-9a-f]+[:/])|(((([0-9]+)|(0x[0-9A-F]+))\.){3}(([0-9]+)|(0x[0-9A-F]+))[:/]))).+";

5. OK をクリックして、値を保存します。この状態で再度取引先企業を
作成し、プラグインを実行してください。上記値が既定値と同じであるため
今までと同じように動作します。

6. 動作の確認が行えたら、再度レジストリエディターに戻り、上記の値の
http の後ろにある [s] から [] を取り除きます。これで HTTPS という文字列が
URL に必須となります。

"^https?://(?!((localhost[:/])|(\[.*\])|([0-9]+[:/])|(0x[0-9a-f]+[:/])|(((([0-9]+)|(0x[0-9A-F]+))\.){3}(([0-9]+)|(0x[0-9A-F]+))[:/]))).+";

7. OK をクリックして、値を保存します。レジストリの反映のためにサービス
コンソールより 「Microsoft Dynamics CRM サンドボックス処理サービス」 を
再起動します。

8. 再度取引先企業を作成し、プラグインを実行してください。以下のように
エラーが出れば成功です。

image

9. 「ログ ファイルのダウンロード」 をクリックして、ログを確認します。以下の
ログが確認できます。

Downloading the target URI: https://blogs.msdn.com/crmJapan
Exception: System.Security.SecurityException: 型 'System.Net.WebPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
   場所 System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   場所 System.Net.WebClient.DownloadData(Uri address)
   場所 Microsoft.Crm.Sdk.Samples.WebClientPlugin.Execute(IServiceProvider serviceProvider)
失敗した操作:
Demand
失敗した最初のアクセス許可の種類:
System.Net.WebPermission
失敗したアセンブリのゾーン:
MyComputer

10. 設定を元に戻すにはレジストリで値を戻すか、項目を削除してから
Microsoft Dynamics CRM サンドボックス処理サービスを再起動します。

まとめ

サンドボックスに登録されたプラグインから Web にアクセスできることは
情報取得や提供の大きなメリットですが、既にあるリソースが利用できないか
事前に検討することをお勧めします。

プラグインをトリガーしたレコードの情報は InputParameter や Image で
渡すことができますし、組織内の情報は Organization Service で取得
可能です。また Azure 連携は既に機能が提供されています。これらの
機能で要望が満たせない場合に、Web アクセスの利用を検討してください。

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