WebAPIService クラス ライブラリ (C#)

WebAPIService は、Dataverse Web APIを使用するときに含める必要があるいくつかの重要な機能を示すサンプル .NET 6.0 クラス ライブラリ プロジェクトです。

このライブラリでは、以下を示します:

  • .NET の回復性と一時的なエラー処理ライブラリ Polly による Dataverse サービス保護制限の管理。
  • IHttpClientFactory を使用した .NET での HttpClient の管理。
  • 構成データを使用したクライアントの動作の管理。
  • Dataverse Web API によって返されるエラーの管理。
  • コード再利用のパターン:
    • HttpRequestMessageHttpResponseMessage を継承するクラスの作成。
    • これらのクラスを使用するメソッド。
    • 必要に応じて新しい機能を追加するためのモジュール パターン。

注意

このサンプル ライブラリは、すべての Dataverse C# Web API サンプルで使用されるヘルパーですが、SDK ではありません。 それを使用するサンプルが正常に動作することを確認するためだけにテストされます。 このサンプル コードは「現状のまま」提供され、再利用の保証はありません。

このライブラリには以下の機能はありません:

  • 認証の管理。 これは、使用する アクセス トークン を提供するアプリケーションから渡される関数に依存します。 すべての Web API サンプルは、Microsoft 認証ライブラリ (MSAL) を使用して認証を管理する、共有済み アプリ クラス に依存します。 MSAL では、いくつかの異なる種類の認証フローがサポートされています。 これらのサンプルでは、​​簡素化のために ユーザー名/パスワード (ROPC) フローを使用していますが、このフローは推奨されません。 アプリの場合は、他のフローのいずれかを使用する必要があります。 詳細: Microsoft 認証ライブラリでの認証フローのサポート
  • コード生成機能の提供。 サンプルで使用されるすべてのクラスは手動で記述されています。 すべてのビジネス エンティティ データは、エンティティ タイプを表すクラスではなく、既知の Json.NET JObject クラス を使用します。
  • OData クエリを作成するためのオブジェクト モデルの提供。 すべてのクエリは、OData クエリ構文をクエリ パラメーターとして表示します。

コード

WebApiService クラスライブラリのソース コードと Visual Studio ソリューションは PowerApps - サンプル/cds/webapi/C#/CDSWebApiService にあります

クラス リスト

次が WebAPIService に含まれたクラスです。

Service クラス

Service クラスは、IHttpClientFactory を使用して管理される HttpClient を通じて Dataverse に要求を送信するメソッドを提供します。

Service はすべてのサンプルのコア コンポーネントであり、これを使用してサンプル コードで示されている操作を完了できます。 WebAPIService に含まれる他のすべてのもの、またはそれを使用するサンプルはコードの再利用を可能にし、Dataverse Web API の機能をより高いレベルでデモンストレーションできるようにします。

Service コンストラクターは、次の 2 つの必須プロパティを含む Config クラス インスタンスを受け取ります: GetAccessToken および Url。 他のすべてのプロパティは、既定値を持つオプションを表します。

コンストラクターは依存関係の挿入を使用して、ConfigureHttpClient 関数で指定されたプロパティを持つ名前付き HttpClient を返すことができる IHttpClientFactory を作成します。 このクライアントが Cookie を使用するかどうかは、Config.DisableCookies パラメータが設定されているかどうかによって決まります。 コンストラクターでは、一時的なエラーと GetRetryPolicy サービス保護制限の管理方法を制御する静的 Dataverse メソッドによって定義されたポリシー。

サービス メソッド

Service クラスには、次のメソッドがあります:

SendAsync メソッド

このメソッドは、すべての操作の最終的な責任を負います。

このメソッドは:

SendAsync<T> メソッド

このメソッドは、Dataverse Web API の OData アクションおよび関数によって返される ComplexTypes にあるプロパティを含むクラスを返すことを容易にします。

  • HttpRequestMessage パラメーターを持ちます。 このメソッドを使用する場合、要求パラメータが HttpResponseMessage から派生した *応答クラス のいずれかであることが想定されますが、必須ではありません。
  • THttpResponseMessage から派生したクラスである Task<T> を返します。 詳細については、*応答クラス を参照してください。
  • SendAsync メソッド を呼び出します。
  • HttpResponseMessage As<T> を使用し、要求された型を返します。

次の例は、WhoAmI function の使用法を示しています:

static async Task WhoAmI(Service service)
{
   var response = await service.SendAsync<WhoAmIResponse>(new WhoAmIRequest());

   Console.WriteLine($"Your user ID is {response.UserId}");
}
ParseError メソッド

このメソッドは、失敗した HttpResponseMessage HttpRequestMessage の内容を解析して ServiceException を返します。 SendAsync メソッド は、HttpResponseMessage.IsSuccessStatusCode プロパティ が false の場合にこのメソッドを使用します。 また、BatchRequest.ContinueOnError プロパティが true に設定されているときに、BatchResponse.HttpResponseMessages から返された HttpResponseMessage インスタンスからエラー情報を抽出するためにも使用できます。 詳細: Batch

Service プロパティ

Service には 1 つのプロパティがあります: BaseAddress

BaseAddress プロパティ

このプロパティは、Config.Url で設定された基本 URL を返します。 この URL は、BatchRequest クラスをインスタンス化するとき、および絶対 URL が必要な場合に相対URLに追加するときに必要になります。

Config クラス

Config クラスには、次の表に示すように、アプリケーションの動作を制御するプロパティが含まれています。

Property タイプ Description
GetAccessToken Func<Task<string>> アクセス トークンを返すためにクライアント アプリケーションによって提供される関数。
Url string? 環境の基本 URL。 例: https://org.api.crm.dynamics.com
CallerObjectId Guid 偽装に適用する SystemUser.ActiveDirectoryGuid 値。 デフォルトは Guid.Empty です
詳細情報: Web API を使用して別のユーザーを偽装する
TimeoutInSeconds ushort タイムアウトまでの待機時間。 既定値は 120 秒です。
MaxRetries byte サービス保護制限が発生したときに再試行する最大回数。 既定値は 3 です。
Version string 使用するサービスのバージョン。 既定は v9.2
DisableCookies bool データの一括読み込みシナリオでパフォーマンスを向上させるために Cookie を無効にするかどうか。 詳細: サーバーの親和性

EntityReference クラス

EntityReference クラスは Dataverse テーブルのレコードをへの参照を表します。 OData は URL でリソースを識別します。 EntityReference は、URL のプロパティの作成とアクセスを簡単にするメソッドを提供します。

EntityReference コンストラクター

次のコンストラクターを使用して、 EntityReference をインスタンス化します。

EntityReference(string entitySetName, Guid? ID)

EntitySetNameGuid を使用してエンティティ参照を作成します。

EntityReference(string uri)

絶対または相対 URL を解析して、代替キーを使用する URL を含むエンティティ参照を作成します。

EntityReference(string setName, Dictionary<string, string>? keyAttributes)

このコンストラクターを使用して、代替キーを使用してエンティティ参照をインスタンス化します。

注意

キー値は文字列値である必要があります。 これにより、他の型が適切な文字列に変換されることはありません。

EntityReference プロパティ

EntityReference には、次の公開プロパティがあります。

Property タイプ Description
Id Guid? 代替キー を使用しない場合のレコードの主キー値。
KeyAttributes Dictionary<string, string> URL で使用される代替キー値を表す文字列値。
SetName string エンティティ型の EntitySetName
Path string レコードへの相対 URL。

EntityReference メソッド

EntityReference には、次の公開メソッドがあります。 どちらもパラメーターを必要としません。

メソッド名 返り値の種類 説明設定
AsODataId string OData 関数の URL 内のレコードへのパラメーター参照として使用するために書式設定された文字列を返します。
AsJObject JObject OData アクション内のレコードへのパラメーター参照として使用できる JObject を返します。

エラー クラス

ODataErrorErrorODataException は、サービスから返されたエラーを逆シリアル化するために使用されるクラスです。 彼らと直接協力する必要はありません。

ServiceException

ServiceException は、サービスによって返されたエラーのプロパティを含む Exception クラス です。 ParseError メソッド を使用し、この例外のインスタンスを取得します。

拡張

WebApiService は、.NET 型の拡張メソッドが 1 つあります。

HttpResponseMessage As<T>

この拡張機能は、THttpResponseMessage から派生した T のインスタンスをインスタンス化し、HttpResponseMessage のプロパティを派生クラスにコピーします。 Service SendAsync<T> Method はこのメソッドを使用しますが、個別に使用することもできます。 たとえば、バッチリクエスト クラスを使うとき、BatchResponse.HttpResponseMessages 内の項目は HttpResponseMessage タイプです。 この拡張機能を使用して、それらを適切な派生クラスに変換し、プロパティへのアクセスを容易にすることができます。

[メッセージ]

Messages フォルダーには、HttpRequestMessage または HttpResponseMessage を継承するクラスが含まれています。

これらのクラスは、どの Dataverse 環境でも使用できる OData 操作に対応する、要求と応答の再利用可能な定義を提供します。

これらのクラスは、これらの型から派生することなく、HttpRequestMessageHttpResponseMessage を使用して適用できる特定の操作の例も提供します。

アプリケーション内では、同じパターンを使用して、環境内のカスタム API を表すなど、カスタム メッセージを作成することもできます。 これらはモジュール クラスであり、WebAPIService.Messages フォルダーに含める必要はありません。

たとえば、Web API 関数とアクションのサンプル (C#) は、カスタム API を含むソリューションがインストールされるまで、Dataverse に含まれていないカスタム API を使用します。 このメッセージを使用するための対応するクラスの定義は、このメッセージを使用するサンプル アプリケーションにあります。

*要求クラス

これらのクラスには通常、操作を実行するために必要なデータが含まれる HttpRequestMessage パラメータをインスタンス化するコンストラクタがあります。 必要に応じて、個別のプロパティを持つことができます。

このパターンの最もシンプルな例は、WhoAmIRequest クラスです。

namespace PowerApps.Samples.Messages
{
    /// <summary>
    /// Contains the data to perform the WhoAmI function
    /// </summary>
    public sealed class WhoAmIRequest : HttpRequestMessage
    {
        /// <summary>
        /// Initializes the WhoAmIRequest
        /// </summary>
        public WhoAmIRequest()
        {
            Method = HttpMethod.Get;
            RequestUri = new Uri(
                uriString: "WhoAmI", 
                uriKind: UriKind.Relative);
        }
    }
}

これらのクラスの名前は通常、Dataverse SDK Microsoft.Xrm.Sdk.Messages Namespace でこのクラスと調節しますが、これらの操作に限定されません。 Web API は、例えば、CreateRetrieveRequest レコードを作成し、それを取得するメッセージである、SDK では実行できないいくつかの操作を実行するために提供されます。 Dataverse SDKは、単一の要求でこの機能を提供しません。

*応答クラス

*リクエストクラスは値を返すとき、対応する *返されたプロパティにアクセスするための応答クラスがあります。 もし *返品のリクエスト 204 No Content の場合、操作は HttpResponseMessage を返しますが、派生クラスはありません。 SendAsync メソッド を使用して、これらの要求を送信します。

*応答クラスは、HttpResponseMessage Headers または Content プロパティにアクセスし、それらを解析して、操作によって返される複合型へのアクセスを提供する型付きプロパティを提供します。

WhoAmIResponse クラスは例です。 このクラス内で、WhoAmIResponse ComplexType のプロパティを抽出するために必要なすべてのコードを見つけることができます。

using Newtonsoft.Json.Linq;

namespace PowerApps.Samples.Messages
{
    // This class must be instantiated by either:
    // - The Service.SendAsync<T> method
    // - The HttpResponseMessage.As<T> extension in Extensions.cs

    /// <summary>
    /// Contains the response from the WhoAmIRequest
    /// </summary>
    public sealed class WhoAmIResponse : HttpResponseMessage
    {

        // Cache the async content
        private string? _content;

        //Provides JObject for property getters
        private JObject _jObject
        {
            get
            {
                _content ??= Content.ReadAsStringAsync().GetAwaiter().GetResult();

                return JObject.Parse(_content);
            }
        }

        /// <summary>
        /// Gets the ID of the business to which the logged on user belongs.
        /// </summary>
        public Guid BusinessUnitId => (Guid)_jObject.GetValue(nameof(BusinessUnitId));

        /// <summary>
        /// Gets ID of the user who is logged on.
        /// </summary>
        public Guid UserId => (Guid)_jObject.GetValue(nameof(UserId));

        /// <summary>
        /// Gets ID of the organization that the user belongs to.
        /// </summary>
        public Guid OrganizationId => (Guid)_jObject.GetValue(nameof(OrganizationId));
    }
}

これらのクラスは、SendAsync< T> Method または、BatchResponse.HttpResponseMessages プロパティの HttpResponseMessage の中に HttpResponseMessage As< T> の拡張子によって返されます。

バッチ

Batch フォルダーには、OData $batch 要求の送信を管理する 3 つのクラスが含まれています。 詳細: Web API を使用してバッチ操作を実行する

BatchRequest

BatchRequest コンストラクターは、SendAsync<T> メソッド で使用できる HttpRequestMessage を初期化し、バッチで要求を送信します。 コンストラクターでは、Service.BaseAddress 値をパラメーターとして渡す必要があります。

BatchRequest には、次のプロパティがあります。

Property タイプ 説明設定
ContinueOnError Bool エラーが発生したときにバッチ操作を続行するかどうかを制御します。
ChangeSets List<ChangeSet> バッチに含まれる 1 つ以上の変更セット。
Requests List<HttpRequestMessage> ChangeSet の外に送信される 1 つ以上の HttpMessageRequest

ChangeSets または Requests が設定されると、HttpMessageContent にカプセル化され、要求の Content に追加されます。 プライベート ToMessageContent メソッドは、ヘッダーに必要な変更を適用し、ChangeSetsRequests の両方のプロパティの HttpMessageContent を返します。

Changeset

変更セットは、トランザクション内で完了する必要がある要求のグループを表します。

次の 1 つのプロパティが含まれます:

Property タイプ 説明設定
Requests List<HttpRequestMessage> トランザクション内で実行される 1 つ以上の HttpMessageRequest

BatchResponse

BatchResponse には 1 つのプロパティがあります:

Property タイプ 説明設定
HttpResponseMessages List<HttpResponseMessage> $batch 演算からの応答。

BatchResponse には、個々の HttpResponseMessage に返された MultipartContent を解析するために、HttpResponseMessages プロパティ ゲッターによって使用されるプライベート ParseMultipartContent メソッドがあります。

返された HttpResponseMessage インスタンスの型プロパティにアクセスするには、HttpResponseMessage As<T> 拡張メソッドを使用します。

メソッド

頻繁に実行される操作の場合、Methods フォルダーには、Service クラスの拡張機能が含まれます。 これらのメソッドを使用すると、対応する *Request クラスを 1 行で使用できます。

次のメソッドが含まれます:

メソッド 返り値の種類 説明設定
Create Task<EntityReference> 新しいレコードを作成します。
CreateRetrieve Task<JObject> 新しいレコードを作成して取得します。
Delete Task レコードを削除します。
FetchXml Task<FetchXmlResponse> FetchXml クエリの結果を取得します。 要求が $batch を使用して POST で送信され、GET で送信される長い URL が制限を超える可能性がある問題を緩和します。
GetColumnValue<T> Task<T> テーブル行から単一の列値を取得します。
Retrieve Task<JObject> レコードを取得します。
RetrieveMultiple Task<RetrieveMultipleResponse> 複数のレコードを取得します。
SetColumnValue<T> Task テーブル行の列の値を設定します。
Update Task レコードを更新します。
Upsert Task<UpsertResponse> レコードに対して Upsert を実行します。

サンプル アプリケーション内で使用する WebAPIService、操作が次の場所で見つかったAPIを表していない場合 Dataverse デフォルトでは、メソッドはアプリケーション内ではなくアプリケーション内で定義されます。 WebAPIService

たとえば、Web API 関数とアクションのサンプル (C#) は、カスタム API を含むソリューションがインストールされるまで、Dataverse に含まれていないカスタム API を使用します。 このメソッドの定義は、使用するサンプル アプリケーションにあります: FunctionsAndActions/Methods/IsSystemAdmin.cs

Types

Types フォルダーには、メッセージのパラメーターまたは応答プロパティとして必要な ComplexTypes または EnumTypes に対応するクラスまたは列挙型が含まれています。

Metadata

Metadata フォルダーには、Dataverse スキーマ定義で動作する操作に固有の MessagesTypes が含まれています。 これらのクラスには、複合型を返す多くのプロパティが含まれることがよくあります。 これらのタイプは、Web API テーブルスキーマ操作サンプル (C#) で使用されます。

参照

Web API 基本操作のサンプル (C#)
Web API クエリ データのサンプル (C#)
Web API 条件付き演算サンプル (C#)
Web API 機能およびアクションのサンプル (C#)
Web API テーブル スキーマ操作サンプル (C#)
Web API WebApiService の並列演算のサンプル (C#)
TPL データフロー コンポーネントを使用した Web API 並列演算のサンプル (C#)

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。