次の方法で共有


Azure ソリューション用のリスナー アプリケーションの記述

このトピックでは、Azure Service Bus にポストされた Microsoft Dataverse メッセージを読み取りおよび処理できる Azure ソリューション リスナー アプリケーションの記述方法について説明します。 Dataverse リスナーの仕様を学習する前に、前提要件として、Azure Service Bus リスナーの記述方法を知る必要があります。 詳細については、「Azure サービス バス ドキュメント」を参照してください。

キュー リスナーを記述する

メッセージ キューは、Service Bus エンドポイントで受信されるメッセージのリポジトリです。 キュー リスナーは、それらのキュー メッセージを読み取って処理するアプリケーションです。 Service Bus メッセージはキューに格納されるため、リスナーはキュー内で受信されるメッセージをアクティブにリスニングする必要はありません。 キュー リスナーは、メッセージがキュー内に到達した後に開始されても、それらのメッセージを処理できます。 次のセクションで説明するその他の種類のリスナーは、アクティブにリッスンしていないとメッセージを読み取れません。 これらのメッセージは、Dataverse またはその他のソースから送信されます。

重要

キュー リスナーを記述する際には、各メッセージ ヘッダー アクションをチェックして、メッセージが Dataverse からのものであるかどうかを確認します。 これを行う方法については、「メッセージのフィルター処理」を参照してください。

ReceiveMode.ReceiveAndDelete モードの Receive を使用して破壊的メッセージ読み取りを行うと、メッセージは読み取られキューから削除されます。または、ReceiveMode.PeekLock モードを使用して非破壊的メッセージ読み取りを行うと、メッセージは読み取られますがキューにそのまま残ります。 キューからメッセージを読むことについての詳細は、「キューからのメッセージの受信方法」を参照してください。

トピックはキューに似ていますが、公開/サブスクライブ モデルを実装します。 一つ以上リスナーがトピックをサブスクライブし、キューからメッセージを受信することができます。 詳細: キュー、トピック、およびサブスクリプション

重要

これらの契約を使用するには、Azure SDK バージョン 1.7 またはそれ以降を使用して、リスナー アプリケーションを記述する必要があります。

マルチシステム ソフトウェアの設計でキューおよびトピックを使用すると、システムのデカップリングが生じます。 リスナー アプリケーションを使用できないようにすると、Dataverse からメッセージは引き続きの配信され、オンラインに戻るとリスナー アプリケーションはキュー メッセージを引き続き処理することができます。 詳細: キュー、トピック、およびサブスクリプション

一方向、二方向、または REST リスナーの記述

先に説明したキュー リスナーに加えて、Dataverse でサポートされているその他 3 つの Service Bus コントラクト用のリスナーを記述できます。それらのリスナーは、一方向、二方向、および REST リスナーです。 一方向リスナーは、Service Bus にポストされたメッセージを読み取って処理できます。 二方向リスナーは、同じことをできますが、いくつかの情報の文字列を Dataverse に返します。 REST リスナーは、REST エンドポイントを使用して機能する点を除いて二方向リスナーと同じです。 これらのリスナーは、Service Bus 経由で送信されたメッセージを読み取るために、サービス エンドポイントをアクティブにリッスンする必要があります。 Dataverse が Message を Service Bus へ投稿しようとしたときにリスナーがリッスンしていなかった場合、Message は送信されません。

リスナーの記述は、ABC (アドレス、バインディング、コントラクト) と呼ばれる要素によって構造化されます。

一方向リスナー

リスナーがエンドポイントに登録された後、Dataverse によってメッセージが Service Bus にポストされると、リスナーの Execute メソッドが呼び出されます。 Execute メソッドは、メソッド呼び出しからデータを返すことはしません。 詳細については、一方向リスナーのサンプル「サンプル: 一方向リスナー」を参照してください。

二方向リスナー

この二方向コントラクトの場合、Execute メソッドはメソッド呼び出しの結果として文字列を返します。 詳細については、二方向リスナーのサンプル「サンプル: 二方向リスナー」を参照してください。

REST リスナー

REST コントラクトの場合、Execute メソッドはメソッド呼び出しの結果として文字列を返します。 詳細については、REST リスナーのサンプル、サンプル: REST リスナーを参照してください。 二方向リスナーのサンプルでは ServiceHost がインスタンス化されますが、REST リスナーのサンプルでは、WebServiceHost がインスタンス化されます。

注意

二方向または REST リスナーで標準のプラグイン (ServiceBusPlugin) を使用する場合、プラグインはリスナーから返される文字列データを使用しません。 ただし、カスタム Azure 対応のプラグインではこの情報を使用できます。

リスナー サンプルを実行すると、入力を求められる発行者シークレットは、Azure Service Bus 管理キーです。 WS2007 Federation HTTP バインディングでは、token と WS-Trust 1.3 プロトコルが使用されます。

メッセージのフィルター処理

Dataverse から送信された仲介メッセージ Properties プロパティごとに追加された追加情報のプロパティ バッグがあります。 プロパティ バッグには、キュー、中継、およびトピック コントラクト エンドポイントと共に、次の情報が含まれています。

  • 組織の URI
  • 呼び出し元ユーザー ID
  • 呼び出し元のユーザー ID
  • テーブルの論理名
  • 要求名

この情報は、Dataverse で処理され、Service Bus メッセージがポストされる、組織、ユーザー、テーブル、メッセージ要求を識別します。 これらのプロパティの利用可能性はメッセージが Dataverse から送信されたことを示します。 リスナー コードで、これらの値に基づいてメッセージを処理する方法を決定できます。

複数のデータ形式でのデータ コンテキストの読み取り

現在の Dataverse 操作からのデータ コンテキストは、Service Bus メッセージの本文の Azure ソリューション リスナー アプリケーションに渡されます。 前のリリースでは、.NET バイナリ形式のみがサポートされました。 クロスプラットフォーム (非.NET) 相互運用性の場合、マッピングの場合、メッセージ本文: .NET Binary、JSON、または XML に、3 つのデータ形式の 1 つを指定できるようになりました。 この形式は ServiceEndpoint テーブルMessageFormat 列で指定されます。

メッセージが受信されると、リスナー アプリケーションは、メッセージのコンテンツ タイプに基づいてメッセージ本文のコンテキスト データを読み取ることができます。 そのようにするサンプル コードが以下に示されています。

var receivedMessage = inboundQueueClient.Receive(TimeSpan.MaxValue);  
  
if (receivedMessage.ContentType == "application/msbin1")  
{  
    RemoteExecutionContext context = receivedMessage.GetBody<RemoteExecutionContext>();  
}  
else if (receivedMessage.ContentType == "application/json")  
{  
    //string jsonBody = new StreamReader(receivedMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();  
    RemoteExecutionContext contextFromJSON = receivedMessage.GetBody<RemoteExecutionContext>(  
        new DataContractJsonSerializer(typeof(RemoteExecutionContext)));  
}  
else if (receivedMessage.ContentType == "application/xml")  
{  
    //string xmlBody = new StreamReader(receivedMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();  
    RemoteExecutionContext contextFromXML = receivedMessage.GetBody<RemoteExecutionContext>(  
        new DataContractSerializer(typeof(RemoteExecutionContext)));  
}  

関連項目

Azure 拡張機能
Azure 対応のカスタム プラグインの記述
サンプル: 一方向リスナー
サンプル: 二方向リスナー
サンプル: REST リスナー
Azure ソリューションの Dataverse データとの連携
Azure イベント ハブ ソリューションの Dataverse イベント データとの連携

注意

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

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