サンプル: プラグインからの Web アクセス
このサンプルは、 Web サービスもしくはフィードのようなリソースにアクセスできるプラグインの書き込み方法を示します。 この呼び出しに認められる時間の長さを制限する方法も示します。
このサンプルを実行する方法
- サンプル リポジトリをダウンロードまたは複製して、ローカル コピーを用意します。 このサンプルは、 PowerApps-Samples-master\dataverse\orgsvc\C#\WebAccessPlugin にあります。
- 2 つのプラグイン クラスの例があります:
- WebClientPlugin は WebClient Class を使用
- HttpClientPlugin は HttpClient Class を使用
- Visual Studio でサンプル ソリューションを開き、プロジェクトのプロパティに移動して、ビルド中にアセンブリが署名されることを確認してください。 サンプルのアセンブリ (WebAccessPlugin.dll) をビルドするには F6 を押します。
- プラグイン登録ツールを実行して Microsoft Dataverse サーバーのサンドボックスおよびデータベースにアセンブリを登録します。
- どちらのタイプのプラグインでも、ステップを登録する際に、unsecure の設定欄に Web URI の文字列 (
https://www.microsoft.com
など) を指定します。- 何も指定しない場合、既定値
https://www.bing.com
が使用されます。
- 何も指定しない場合、既定値
- アプリまたは書き込みコードを使って、プラグインを登録したメッセージやテーブルのリクエストを呼び出す適切な操作を行います。
- プラグインを実行すると、呼び出しの期間が15 秒の制限を超えた場合、エラーがスローされます。 それ以外の場合、正常に実行されます。
- テストを完了したらアセンブリとステップの登録を解除します。
このサンプルの概要
実行すると、プラグインは、指定した Web サービス アドレス (つまり既定のアドレス) から Web ページ データをダウンロードします。 要求が 15 秒の制限を超えると、InvalidPluginExecutionException がスローされ、プラグイン トレース ログに詳細を書き込みます。
WebClientPlugin
プラグインが失敗すると、プラグイン トレース ログに次のような内容が書き込まれます。Downloading the target URI: https://www.bing.com Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: The timeout elapsed while attempting to issue the request. ---> System.Net.WebException: The operation has timed out at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) at System.Net.WebClient.DownloadData(Uri address) at PowerApps.Samples.WebClientPlugin.Execute(IServiceProvider serviceProvider) --- End of inner exception stack trace --- at PowerApps.Samples.WebClientPlugin.Execute(IServiceProvider serviceProvider)
HttpClientPlugin
プラグインが失敗すると、プラグイン トレース ログに次のような内容が書き込まれます。Downloading the target URI: https://www.bing.com Inner Exceptions: Exception: System.Threading.Tasks.TaskCanceledException: A task was canceled. Exception: Microsoft.Xrm.Sdk.InvalidPluginExecutionException: An exception occurred while attempting to issue the request. at PowerApps.Samples.HttpClientPlugin.Execute(IServiceProvider serviceProvider)
TaskCanceledException は、タスクがキャンセルされる理由についてややあいまいです。 タイムアウトによるエラーを明示的に検出する方法を示すより詳細なソリューションについては、ブログ投稿 HttpClient 処理のより優れたタイムアウト処理を参照してください。
このサンプルがどのように動作するか
このサンプルは何をするか で説明されているシナリオをシミュレートするために、サンプルは次のことを行います:
設定
- コンストラクターの安全でない構成パラメーターで Web アドレス値を確認します。それ以外の場合は、既定値が使用されます。
- 登録されるプラグインによっては、WebClient Class または HttpClient Class クラスが、プラグインの
Execute
メソッドにより使用され、Web ページ データがダウンロードされます。 - 通話が指定された 15 秒の期間を超えると、InvalidPluginExecutionException がスローされ、エラーの詳細がプラグイン トレース ログに書き込まれます。
実際にやってみます
WebClientPlugin プラグイン
派生した
CustomWebClient
クラスを使って、WebClient
クラスで使用できない WebRequest.Timeout プロパティを設定します。/// <summary> /// A class derived from WebClient with 15 second timeout and KeepAlive disabled /// </summary> public class CustomWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); if (request != null) { request.Timeout = 15000; //15 Seconds request.KeepAlive = false; } return request; } }
WebClient.DownloadData メソッドを使用し、リソースからデータをダウンロードします。
予想される WebException クラスを解析し、Status プロパティを使用してエラーの原因がタイムアウトかどうかを判断する方法を示します。
HttpClientPlugin プラグイン
- HttpClient クラスを使い、Timeout プロパティを使って操作の完了までに許容される時間を制限します。
- 予想される AggregateException クラスを取得し、予想される TaskCanceledException の内部例外を調べます