Azure ソリューション用のリスナー アプリケーションの記述
この トピック では、Azure Service Busに投稿されたメッセージを読み取ることができるAzureソリューション リスナー アプリケーションを作成する方法について説明します。 Microsoft Dataverse Dataverse リスナーの仕様を学習する前に、前提要件として、Azure Service Bus リスナーの記述方法を知る必要があります。 詳細については、「Azure サービス バス ドキュメント」を参照してください。
キュー リスナーを記述する
メッセージ キューは、Service Bus エンドポイントで受信されるメッセージのリポジトリです。 キュー リスナーは、それらのキュー メッセージを読み取って処理するアプリケーションです。 Service Bus メッセージはキューに格納されるため、リスナーはキュー内で受信されるメッセージをアクティブにリスニングする必要はありません。 キュー リスナーは、メッセージがキューに到着した後でも起動でき、それらのメッセージを処理できます。 次のセクションで説明する他のタイプのリスナーは、積極的に聞く必要があり、そうしないとメッセージを読む機会を逃してしまいます。 これらのメッセージは、Dataverse またはその他のソースから送信されます。
重要
キュー リスナーを記述する際には、各メッセージ ヘッダー アクションをチェックして、メッセージが Dataverse からのものであるかどうかを確認します。 これを行う方法については、「メッセージのフィルター処理」を参照してください。
Receive を ReceiveMode.ReceiveAndDelete モードで使用して破壊的なメッセージ読み取りを行うと、メッセージが読み取られてキューから削除されます。また、 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 (アドレス、バインディング、コントラクト) と呼ばれる要素によって構造化されます。
一方向リスナー
アドレス: サービス URI
バインディング: WS2007HttpRelayBinding
コントラクト: IServiceEndpointPlugin
リスナーがエンドポイントに登録された後、Dataverse によってメッセージが Service Bus にポストされると、リスナーの Execute メソッドが呼び出されます。 Execute
メソッドは、メソッド呼び出しからデータを返すことはしません。 詳細については、一方向リスナーのサンプル「サンプル: 一方向リスナー」を参照してください。
二方向リスナー
アドレス: サービス URI
バインディング: WS2007HttpRelayBinding
コントラクト: ITwoWayServiceEndpointPlugin
この二方向コントラクトの場合、Execute メソッドはメソッド呼び出しの結果として文字列を返します。 詳細については、二方向リスナーのサンプル「サンプル: 二方向リスナー」を参照してください。
REST リスナー
アドレス: サービス URI
バインディング: WebHttpRelayBinding
コントラクト: IWebHttpServiceEndpointPlugin
REST コントラクトの場合、Execute メソッドはメソッド呼び出しの結果として文字列を返します。 詳細については、REST リスナーのサンプル、サンプル: REST リスナーを参照してください。 二方向リスナーのサンプルでは ServiceHost がインスタンス化されますが、REST リスナーのサンプルでは、WebServiceHost がインスタンス化されます。
注意
双方向リスナーまたはRESTリスナーですぐに使用できるサービス エンドポイント プラグインを使用する場合、プラグインはリスナーから返される文字列データを使用しません。 ただし、カスタム Azure 対応のプラグインではこの情報を使用できます。
リスナー サンプルを実行すると、入力を求められる発行者シークレットは、Azure Service Bus 管理キーです。 WS2007 Federation HTTP バインディングでは、token
と WS-Trust 1.3 プロトコルが使用されます。
メッセージのフィルター処理
各ブローカー メッセージには、追加情報のプロパティ バッグが追加されます。 プロパティ 送信元プロパティ Dataverse。 プロパティ バッグには、キュー、中継、およびトピック コントラクト エンドポイントと共に、次の情報が含まれています。
- 組織の URI
- 呼び出し元ユーザー ID
- 呼び出し元のユーザー ID
- テーブルの論理名
- 要求名
この情報は、Dataverse で処理され、Service Bus メッセージがポストされる、組織、ユーザー、テーブル、メッセージ要求を識別します。 これらのプロパティの利用可能性はメッセージが Dataverse から送信されたことを示します。 リスナー コードで、これらの値に基づいてメッセージを処理する方法を決定できます。
複数のデータ形式でのデータ コンテキストの読み取り
現在の Dataverse 操作からのデータ コンテキストは、Service Bus メッセージの本文の Azure ソリューション リスナー アプリケーションに渡されます。 前のリリースでは、.NET バイナリ形式のみがサポートされました。 クロスプラットフォーム (非.NET) 相互運用性の場合、マッピングの場合、メッセージ本文: .NET Binary、JSON、または XML に、3 つのデータ形式の 1 つを指定できるようになりました。 この形式は ServiceEndpoint テーブルの MessageFormat 列で指定されます。
メッセージを受信すると、リスナー アプリケーションは、コード サンプルに示すように、メッセージのcontentTypeに基づいてメッセージ本文のデータ コンテキストを読み取ることができます。
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 分かかります。 個人データは収集されません (プライバシー ステートメント)。