次の方法で共有


webhook を使用してサーバー イベント用に外部ハンドラーを作成する

Dynamics 365 for Customer Engagement アプリ バージョン 9.0 より、webhook を使用してサーバーで発生するイベントに関するデータを Web アプリケーションに送信できます。 webhook は、Web API およびサービスをパブリッシュ/サブスクライブ モデルと接続するためのライトウェイト HTTP パターンです。 webhook の送信側は、イベントに関する情報を使用して受信側のエンドポイントに要求を行うことで、受信側にイベントについて通知します。

webhook を使用すると、開発者と ISV は Customer Engagement のデータを、外部サービスでホストされている自らのカスタム コードに統合できます。 webhook モデルを使用することにより、認証ヘッダーまたはクエリ文字列パラメーター キーを使用してエンドポイントを保護できます。 これは、Azure Service Bus 統合用に現在使用できる SAS 認証モデルよりも簡単です。

webhook モデルと Azure Service Bus 統合とのどちらを選ぶか選択する場合、次の点に留意します。

  • Azure Service Bus はハイスケール処理に向いており、Dynamics 365 が多くのイベントをプッシュする場合にフルキュー メカニズムを提供します。
  • Webhook は、ホストされている Web サービスがメッセージを処理できる範囲内でしか拡張できません。
  • Webhooks は、同期と非同期のステップを可能にします。 Azure Service Bus では、非同期のステップのみ可能です。
  • webhook は JSON ペイロードの送信 POST 要求のみを送信し、任意のプログラミング言語または任意の場所でホストされる Webアプリケーションで使用できます。
  • webhook と Azure Service Bus のいずれも、プラグインまたはユーザー定義のワークフロー活動から呼び出すことができます。

はじめに

webhook の使用には3つの部分があります。

  • webhook 要求を使用するためにサービスを作成または構成する。
  • Dynamics 365 サービスで webhook のステップを登録する。または、
  • プラグインまたはユーザー定義ワークフロー活動から webhook を呼び出す。

このトピックでは、まず webhook を登録する方法および要求記録サイトを使用して登録をテストする方法についてで説明します。 この情報は、「webhook 要求を使用するためにサービスを作成または構成する」で説明されているように、webhook 要求を使用するために設計されたサービスの作成と構成の要件について知るのに役立ちます。

webhook の登録

プラグイン登録ツールを使用して webhook を登録します。 プラグイン登録ツールを取得するには、Dataverse 開発ツール を参照してください。

プラグイン登録ツールには、新しい webhook の登録オプションがあります。

新しい Web フックを登録するためのメニュー オプションを表示します。キーボード ショートカットは Ctrl+W です。

webhook の登録時に、2 つの情報アイテムを提供する必要があります。

アイテム 内容
名前 webhook を示す一意の名前。
エンドポイント URL 実行コンテキスト情報のポスト先となる URL。
認証 3 つの認証オプションのうちの 1 つ。 どの認証タイプでも、要求が正当であることを示すキーを提供する必要があります。

認証オプション

どの webhook 登録認証オプションと値を使用するのが正しいかは、エンドポイントが何を期待するかによって異なります。 エンドポイントの所有者が何を使用するか伝える必要があります。 Dynamics 365 で webhooks を使用するには、エンドポイントは以下の 3 つの認証オプションのいずれかを使用する必要があります。

種類​​ 内容
HttpHeader http 要求のヘッダーに 1 つ以上のキー値ペアが含まれます。
例 :
Key1: Value1
Key2: Value2
WebhookKey code をキーとして使用してするクエリ文字列、およびエンドポイントに必要な値が含まれています。 プラグイン登録ツールを使用して webhook を登録するときは、値のみを入力します。
例 :
?code=00000000-0000-0000-0000-000000000001
HttpQueryString クエリ文字列パラメーターとして 1 つ以上のキー値ペアが含まれます。
例 :
?Key1=Value1&Key2=Value2

Note

WebhookKey オプションは、認証クエリ文字列に code というキー名が想定されるため、Azure Functionsで使用すると便利です。

構成されたエンドポイントへの要求は、要求で渡された認証オプションが一致しない場合は失敗します。 これはエンドポイントの責任です。

webhook 登録のクエリ

webhook 登録は ServiceEndpoint Entity に格納され、Contract 値は 8 です。

ServiceEndpoint エンティティをクエリすることで登録された webhook の詳細を参照できます。

Web API:

GET [organization URI]/api/data/v9.1/serviceendpoints?$filter=contract eq 8&$select= serviceendpointid,name,authtype,url

FetchXml:

<fetch>
  <entity name="serviceendpoint" >
    <attribute name="serviceendpointid" />
    <attribute name="name" />
    <attribute name="authtype" />
    <attribute name="url" />
    <filter>
      <condition attribute="contract" operator="eq" value="8" />
    </filter>
  </entity>
</fetch> 

設定された認証の値の詳細は AuthValue プロパティにあり、取得できません。

webhook のステップの登録

webhook のステップの登録は、プラグインの手順の登録に似ています。 主な相違点は、構成情報を指定できないことです。

プラグインのようにメッセージを指定し、適切な場合はエンティティのメッセージを指定します。 また、webhook を実行するイベント パイプラインの場所、実行モード、操作が成功した場合に AsyncOperation を削除するかどうかを指定します。

新しい webhook のステップを登録するプラグイン登録ダイアログ。

ステップ名説明の情報は、選択したオプションに基づいて自動挿入されますが、それらは変更可能です。 それらをサポートするメッセージのフィルタ属性を設定しない場合、パフォーマンスのベスト プラクティスとして設定するよう求められます。

実行モードと webhook 登録のデバッグ

webhook の登録の選択は、不具合が生じた場合のデバッグのエクスペリエンスを左右します。

非同期モード

非同期実行モードを使用すると、asyncoperation ジョブが作成され、操作の成功または失敗を取得します。 成功した場合に asyncoperation を削除するよう選択すると、データベースのスペースを節約できます。

発生したエラーはシステム ジョブに記録されます。 Web アプリケーションで、設定 > システム > システム ジョブにアクセスして、任意の webhook のステータスを確認できます。 ステータスの値は失敗になります。 ジョブが失敗した理由の説明を表示するには、失敗したシステム ジョブ エンティティを開きます。

同期モード

同期実行モードを選択すると、失敗はエンドポイントを使用できませんエラー ダイアログによってアプリケーションのユーザーに報告され、webhook のサービス エンドポイントが正しく構成されていないか、利用できないことが通知されます。 ダイアログでは、エラーの詳細を取得するためにログ ファイルをダウンロードすることができます。

Note

同期モードは、webhook によってトリガーされる操作をすぐに実行することが重要である場合、または webhook のペイロードをサービスが受け取らないとトランザクション全体が失敗するようにする場合に使用します。 簡単な webhook ステップの登録では、失敗を管理するための限定的なオプションが提供されていますが、詳細な制御が必要な場合はプラグイン ワークフロー活動を使用してwebhook を呼び出すこともできます。 詳細: プラグインまたはワークフロー活動から webhook を呼び出す

失敗の理由

webhook 比較的簡単です。 サービスは要求を送信して応答を評価します。 システムは応答の本文で返されたデータを解析できず、応答の StatusCode 値だけを見ます。

タイムアウトは 60 秒です。 通常は、タイムアウト期間前、または応答の StatusCode 値が成功または失敗を示す 2xx の範囲内にない場合、応答は返されません。 返されたエラーが次の表にある場合は例外です。

StatusCode 内容
502 誤ったゲートウェイ
503 サービスは使用できません
504 ゲートウェイのタイムアウト

これらのエラーは、再度の試みによって解決される可能性がある問題を示しています。 webhook サービスは、これらのエラー コードが返されたときにのみさらに 1 回試行します。

失敗し非同期ジョブのデータを取得する方法の詳細については、「特定のステップで失敗した非同期ジョブをクエリする」を参照してください。

webhook に登録されたステップをクエリする

登録された webhook のデータは SdkMessageProcessingStep エンティティにあります。

webhook の serviceendpointid を知っている場合に特定の webhook に登録されているステップをクエリできます。 登録されている webhook の ID を取得するクエリについては、「webhook 登録のクエリ」を参照してください。

Web API:

この Web API クエリを使用でき、<id> は webhook の ServiceEndpointId です。

GET [organization URI]/api/data/v9.1/serviceendpoints(@id)/serviceendpoint_sdkmessageprocessingstep?$select=sdkmessageprocessingstepid,name,description,asyncautodelete,filteringattributes,mode,stage?@id=<id>

登録されたステップに関する詳細については、この Web API クエリを使用でき、<stepid> はステップの SdkMessageProcessingStepId です。

GET [organization URI]/api/data/v9.1/sdkmessageprocessingsteps(@id)?$select=name,description,filteringattributes,asyncautodelete,mode,stage&$expand=plugintypeid($select=friendlyname),eventhandler_serviceendpoint($select=name),sdkmessagefilterid($select=primaryobjecttypecode),sdkmessageid($select=name)?@id=<stepid>

FetchXML:

この FetchXML を使用して 1 つのクエリで同じ情報を取得でき、<serviceendpointid> は WebHook の ID です。

<fetch>
  <entity name="sdkmessageprocessingstep" >
    <attribute name="name" />
    <attribute name="filteringattributes" />
    <attribute name="stage" />
    <attribute name="asyncautodeletename" />
    <attribute name="description" />
    <attribute name="mode" />
    <link-entity name="serviceendpoint" from="serviceendpointid" to="eventhandler" link-type="inner" alias="endpnt" >
      <attribute name="name" />
      <filter>
        <condition attribute="serviceendpointid" operator="eq" value="<serviceendpointid>" />
      </filter>
    </link-entity>
    <link-entity name="sdkmessagefilter" from="sdkmessagefilterid" to="sdkmessagefilterid" link-type="inner" alias="fltr" >
      <attribute name="primaryobjecttypecode" />
    </link-entity>
    <link-entity name="sdkmessage" from="sdkmessageid" to="sdkmessageid" link-type="inner" alias="msg" >
      <attribute name="name" />
    </link-entity>
  </entity>
</fetch>

特定のステップで失敗した非同期ジョブをクエリする

特定のステップの sdkmessageprocessingstepid を知っている場合、任意のエラーの AsynchronousOperations エンティティ をクエリできます。 OwningExtensionId 値を使用して、特定の登録されたステップに結果をフィルターできます。 次の例は <stepid> をステップの sdkmessageprocessingstepid として使用します。

Web API:

GET [organization URI]/api/data/v9.1/asyncoperations?$orderby=completedon desc&$filter=statuscode eq 31 and _owningextensionid_value eq @stepid&$select=name,friendlymessage,errorcode,message,completedon?@stepid=<stepid>

FetchXML:

<fetch>
  <entity name="asyncoperation" >
    <attribute name="name" />
        <attribute name="friendlymessage" />
    <attribute name="errorcode" />
    <attribute name="message" />
    <attribute name="completedon" />     
    <filter>
      <condition attribute="owningextensionid" operator="eq" value="<stepid>" />
    </filter>
    <order attribute="completedon" descending="true" />
  </entity>
</fetch>

要求ログ サイトで登録をテストする

webhook を使用するサービスの作成または構成に移る前に、処理する必要のあるデータを把握するために、サービスが受け取るデータの種類をテストする必要があります。 そのために、幾つかある要求ログ サイトのいずれかを使用できます。 この例では、RequestBin を使用して webhook 要求のターゲットを構成します。 次の手順を実行します。

  1. https://requestbin.com/ に移動し、要求ビンの作成 をクリックします。

  2. 次のページでは、https://<random string>.x.pipestream.net のような Bin URL が提供されます。 この URL をコピーします。

  3. webhook の登録」で説明されているように、プラグイン登録ツールを使用して新しい webhook を登録します。 ステップ 2 でコピーした URL をエンドポイント URL として使用します。 名前と希望する認証プロパティを設定します。 要求 Bin は、データを処理する実際のサイトのようにこれらの値を評価しませんが、どのように受け渡されるかを確認することはできます。

  4. webhook のステップの登録」で説明されているように、ステップ 3 で作成した webhook を使用してプラグイン登録ツールを活用しながらステップを登録します。 取引先担当者エンティティの更新など、Dynamics 365 アプリケーションのデータを編集して簡単に実行できるイベントを使用します。

  5. Dynamics 365 アプリを使用して、イベントをトリガーする操作を実行します。

  6. イベントをトリガーした後、ステップ 2 から RequestBin のページに戻り、ページを更新します。 次のページに似たページが表示されます。

    要求 Bin Web サイトにログされた要求の例。

注意

このサイトに表示される結果は、送信された値の大文字を必ずしも表すものではありません。 HTTP ヘッダーは大文字と小文字を区別しており、RequestBin サイトは値を読みやすくするために何らかのフォーマット ルールを適用しているように見えます。 しかし、Dynamics 365 が送信する値は、ここの表示に関係なくすべて小文字です。 詳細: ヘッダー データ

この例では、HttpHeader 認証キー値ペアを渡すように登録されている webhook において、取引先担当者の更新で webhook 要求に渡されるデータを示しています。

Key Value
X-Test1 test1
X-Test2 test2

エントリの下のRAW BODYセクションに JSON 文字列として実行コンテキスト デーが含まれています。 これは、webhook 要求を処理する Web サービスが評価する必要のあるデータです。 詳細: 要求本文

webhook 要求を使用するためにサービスを作成または構成する

webhook は幅広い技術を使用して適用できる単なるパターンです。 使用する必要のあるフレームワーク、プラットフォーム、またはプログラミング言語はありません。 自分のスキルやノウハウを駆使して適切なソリューションを提供します。 Azure Functions は webhook を使用してソリューションを提供する優れた方法ですが、必須要件ではありません。 このセクションでは、具体的なソリューションに対するガイドを提供するのではなく、ご自分のサービスに付加価値をもたらすデータの受け渡しについて取り上げます。

要求ログ サイトで登録をテストする」で示したように、テスト webhook ステップを登録して、要求ログ サイトを使用してご自分のアプリケーションが処理できる特定のデータの種類を取得できます。

サービスに受け渡されるデータ

要求には、クエリ文字列、ヘッダー データ、および要求本文の 3 種類のデータがあります。

クエリ文字列

認証オプション」で説明されているように、webhook で WebhookKey または HttpQueryString オプションを使用するよう構成されている場合は、クエリ文字列として受け渡される唯一のデータは認証値となる可能性があります。

ヘッダー データ

HttpHeader 認証オプションを選択すると、サービスが要求するキー/値のペアを使用する必要があります。

サービスに受け渡される他のデータについては次の表に示されています。

Key 値の説明
x-request-id 要求の一意の識別子
x-ms-dynamics-organization 要求を送信するテナントの名前
x-ms-dynamics-entity-name 実行コンテキスト データで渡されるエンティティの論理名。
x-ms-dynamics-request-name webhook のステップが登録されたイベントの名前。
x-ms-correlation-request-id 任意の拡張機能の種類を追跡するための一意の識別子。 このプロパティは、無限ループ防止のためにプラットフォームで使用されます。 ほとんどの場合、このプロパティは無視できます。 この値は、操作全体で生じた事柄を把握するためにテレメトリをクエリできるため、テクニカル サポートを扱う際に使用できます。
x-ms-dynamics-msg-size-exceeded HTTP ペイロード サイズが 256KB を超えた場合にのみ送信。

要求本文

本文には、RemoteExecutionContext クラスのインスタンスの JSON 値を表す文字列が含まれます。 これは Azure サービス バス統合に受け渡されるのと同じデータです。

作成したサービスは、サービスが機能を提供するために必要な関連情報アイテムを抽出するために、このデータを解析する必要があります。 データの解析方法は、使用している技術と設定によって異なります。

重要

特定の Service Bus による最適化のために、.NET 型の開発者がその RemoteExecutionContext オブジェクトのために JSON 形式の要求メッセージ本文を 非シリアル化することはお勧めできません。 そうではなく、JObject を、メッセージ本文を解析するために使用します。

次の例は、次のプロパティで登録されているステップに渡されるシリアル化 JSON データを示しています。

プロパティ 内容
メッセージ 更新プログラム
主エンティティ 取引先担当者
副エンティティ なし
フィルタリング属性 名、姓
ユーザーのコンテキストで実行 呼び出し元ユーザー
実行する順番 1
実行のイベント パイプライン ステージ PostOperation
実行モード 非同期

この例では、取引先担当者の名が「Jim」から「James」へ変更されました。

{
    "BusinessUnitId": "e2b9dd85-e89e-e711-8122-000d3aa2331c",
    "CorrelationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
    "Depth": 1,
    "InitiatingUserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
    "InputParameters": [{
        "key": "Target",
        "value": {
            "__type": "Entity:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
            "Attributes": [{
                "key": "firstname",
                "value": "James"
            }, {
                "key": "contactid",
                "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
            }, {
                "key": "fullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "yomifullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "modifiedon",
                "value": "\/Date(1506384247000)\/"
            }, {
                "key": "modifiedby",
                "value": {
                    "__type": "EntityReference:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
                    "Id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
                    "KeyAttributes": [],
                    "LogicalName": "systemuser",
                    "Name": null,
                    "RowVersion": null
                }
            }, {
                "key": "modifiedonbehalfby",
                "value": null
            }],
            "EntityState": null,
            "FormattedValues": [],
            "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "contact",
            "RelatedEntities": [],
            "RowVersion": null
        }
    }],
    "IsExecutingOffline": false,
    "IsInTransaction": false,
    "IsOfflinePlayback": false,
    "IsolationMode": 1,
    "MessageName": "Update",
    "Mode": 1,
    "OperationCreatedOn": "\/Date(1506409448000-0700)\/",
    "OperationId": "4af10637-4ea2-e711-8122-000d3aa2331c",
    "OrganizationId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "OrganizationName": "OrgName",
    "OutputParameters": [],
    "OwningExtension": {
        "Id": "75417616-4ea2-e711-8122-000d3aa2331c",
        "KeyAttributes": [],
        "LogicalName": "sdkmessageprocessingstep",
        "Name": null,
        "RowVersion": null
    },
    "ParentContext": {
        "BusinessUnitId": "e2b9dd85-e89e-e711-8122-000d3aa2331c",
        "CorrelationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
        "Depth": 1,
        "InitiatingUserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
        "InputParameters": [{
            "key": "Target",
            "value": {
                "__type": "Entity:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
                "Attributes": [{
                    "key": "firstname",
                    "value": "James"
                }, {
                    "key": "contactid",
                    "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
                }],
                "EntityState": null,
                "FormattedValues": [],
                "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
                "KeyAttributes": [],
                "LogicalName": "contact",
                "RelatedEntities": [],
                "RowVersion": null
            }
        }, {
            "key": "SuppressDuplicateDetection",
            "value": false
        }],
        "IsExecutingOffline": false,
        "IsInTransaction": false,
        "IsOfflinePlayback": false,
        "IsolationMode": 1,
        "MessageName": "Update",
        "Mode": 1,
        "OperationCreatedOn": "\/Date(1506409448000-0700)\/",
        "OperationId": "4af10637-4ea2-e711-8122-000d3aa2331c",
        "OrganizationId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
        "OrganizationName": "OneFarm",
        "OutputParameters": [],
        "OwningExtension": {
            "Id": "75417616-4ea2-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "sdkmessageprocessingstep",
            "Name": null,
            "RowVersion": null
        },
        "ParentContext": null,
        "PostEntityImages": [],
        "PreEntityImages": [],
        "PrimaryEntityId": "6d81597f-0f9f-e711-8122-000d3aa2331c",
        "PrimaryEntityName": "contact",
        "RequestId": null,
        "SecondaryEntityName": "none",
        "SharedVariables": [{
            "key": "ChangedEntityTypes",
            "value": [{
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "feedback",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "contract",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "salesorder",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "connection",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "socialactivity",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "postfollow",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "incident",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "invoice",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "entitlement",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "lead",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "opportunity",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "quote",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "socialprofile",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "contact",
                "value": "Update"
            }]
        }],
        "Stage": 30,
        "UserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
    },
    "PostEntityImages": [{
        "key": "AsynchronousStepPrimaryName",
        "value": {
            "Attributes": [{
                "key": "fullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "contactid",
                "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
            }],
            "EntityState": null,
            "FormattedValues": [],
            "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "contact",
            "RelatedEntities": [],
            "RowVersion": null
        }
    }],
    "PreEntityImages": [],
    "PrimaryEntityId": "6d81597f-0f9f-e711-8122-000d3aa2331c",
    "PrimaryEntityName": "contact",
    "RequestId": null,
    "SecondaryEntityName": "none",
    "SharedVariables": [],
    "Stage": 40,
    "UserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
}

重要

全体の HTTP ペイロードのサイズが 256KB を超えると、x-ms-dynamics-msg-size-exceeded ヘッダーが含まれ、次の RemoteExecutionContext プロパティが削除されます。

一部の操作では、次のプロパティは含まれません。

プラグインまたはワークフロー活動から webhook を呼び出す

webhook はサービス エンドポイントの一種であるため、Azure Service Bus エンドポイントで行うのと同様に、プラグインやワークフロー活動でステップを登録することなく呼び出すことができます。 ServiceEndpointIdIServiceEndpointNotificationService インターフェイスに提供する必要があります。 詳細については、次の Azure Service Bus のサンプルを参照してください:

関連項目

サーバーで Customer Engagement を拡張する
ビジネス プロセスを拡張するためのプラグインを記述する
Customer Engagement (on-premises) のビジネス プロセスの自動化
Dynamics 365 Customer Engagement (on-premises) での非同期サービス
Dynamics 365 Customer Engagement (on-premises) の Azure 拡張機能
サンプル: Azure 対応のカスタム プラグイン
サンプル: Azure 対応のユーザー定義ワークフロー活動
Azure Functions
ServiceEndpoint エンティティ
SdkMessageProcessingStep エンティティ
AsynchronousOperations エンティティ
RemoteExecutionContext
IServiceEndpointNotificationService