クイック スタート: Azure Event Grid 名前空間トピックからのメッセージの送受信 (.NET)

このクイックスタートでは、次の手順を実行します。

  1. Microsoft Azure portal を使用して Event Grid 名前空間を作成します。
  2. Microsoft Azure portal を使用して Event Grid 名前空間トピックを作成します。
  3. Microsoft Azure portal を使用してイベント サブスクリプションを作成します。
  4. トピックに一連のメッセージを送信するための .NET コンソール アプリケーションを作成する
  5. それらのメッセージをトピックから受信する .NET コンソール アプリケーションを作成する。

Note

このクイックスタートでは、メッセージのバッチを Event Grid 名前空間トピックに送信し、それらを受信するという簡単なシナリオを実装するステップバイステップの手順を説明します。 .NET クライアント ライブラリの概要については、「.NET 用 Azure Event Grid クライアントライブラリ」 (.NET 用 Azure Service Bus クライアント ライブラリ) を参照してください。 その他のサンプルについては、GitHub の Event Grid .NET サンプルを参照してください。

前提条件

このサービスを初めて使用する場合は、このクイックスタートを実行する前に、Event Grid の概要に関する記事を参照してください。

  • Azure サブスクリプション。 Azure Event Grid を含む Azure サービスを使用するには、サブスクリプションが必要です。 Azure アカウントを持っていない場合、無料試用版でサインアップできます。
  • Visual Studio 2022. サンプル アプリケーションでは、C# 10 で導入された新機能を利用しています。 最新の構文を使用するには、.NET 6.0 以降をインストールし、言語バージョンを latest に設定することをお勧めします。 Visual Studio を使用している場合、Visual Studio 2022 より前のバージョンには、C# 10 プロジェクトをビルドするために必要なツールとの互換性がありません。

Azure Portal での名前空間の作成

Azure Event Grid の名前空間は、1 つ以上のトピック、クライアント、クライアント グループ、トピック空間、およびアクセス許可バインド用の論理コンテナーです。 一意の名前空間が提供されるため、同じ Azure リージョンに複数のリソースを持つことができます。 Azure Event Grid 名前空間を使用して、関連するリソースをまとめてグループ化し、Azure サブスクリプションの 1 つのユニットとして管理できるようになりました。

Azure Event Grid 名前空間を作成、表示、管理するには、次のセクションに従ってください。

名前空間を作成するには:

  1. Azure portal にサインインします。

  2. 検索ボックス「Event Grid 名前空間」と入力し、結果から [Event Grid 名前空間] を選択します。

    検索結果の [Event Grid 名前空間] を示すスクリーンショット。

  3. [Event Grid 名前空間] ページで、ツール バーの [+ 作成] を選択します。

    ツール バーの [作成] ボタンが選択されている [Event Grid 名前空間] ページを示すスクリーンショット。

  4. [基本] ページで、次の手順を行います。

    1. 名前空間を作成する [Azure サブスクリプション] を選択します。

    2. 既存のリソース グループを選択するか、新しいリソース グループを作成します。

    3. 名前空間の名前を入力します。

    4. 名前空間を作成するリージョンまたは場所を選択します。

    5. ページ下部にある [確認と作成] を選択します。

      [名前空間の作成] ページの [基本] タブを示すスクリーンショット。

  5. [Review + create] (確認 + 作成) タブで設定を確認し、[作成] を選択します。

  6. [デプロイメント成功] ページで、[リソースに移動] を選択して、対象の名前空間に移動します。

名前空間トピックの作成

  1. [Event Grid 名前空間] ページが表示されていない場合は、名前空間の作成、表示、管理の手順に従って、トピックの作成に使用する名前空間を表示します。

  2. [Event Grid 名前空間] ページで、左側のメニューの [イベント] セクションで [トピック] オプションを選択します。

  3. [トピック] ページで、コマンド バーの [+ トピック] ボタンを選択します。

    Event Grid 名前空間トピックの作成を示すスクリーンショット。

  4. [トピックの作成] ページで、作成するトピックの名前を入力し、[作成] を選択します。

    Event Grid 名前空間トピックの作成の [基本] を示すスクリーンショット。

イベント サブスクリプションの作成

  1. Azure portal で Event Grid 名前空間の [トピック] ページを開いている場合は、トピックの一覧からトピックを選択します。 [トピック] ページを開いている場合は、名前空間トピックの作成、表示、管理の手順に従って、イベント サブスクリプションの作成に使用するトピックを特定します。

    トピックが選択されている [Event Grid トピック] ページを示すスクリーンショット。

  2. [Event Gird 名前空間のトピック] ページで、左側のメニューの [エンティティ] セクションで [サブスクリプション] オプションを選択します。

  3. [サブスクリプション] ページで、コマンド バーの [+ サブスクリプション] ボタンを選択します。

    Event Grid のイベント サブスクリプション作成を示すスクリーンショット。

  4. [基本] タブで、次の手順を行います。

    1. 作成するサブスクリプションの名前を入力します

    2. 配信スキーマCloud Events v1.0 に設定されていることを確認します。

    3. 配信モード[キュー] (プル モード) に設定されていることを確認します。

    4. Next:フィルター がページの下部にあるので、これをクリックします。

      Event Grid のイベント サブスクリプション作成の基本を示すスクリーンショット。

  5. [フィルター] タブで、サブスクリプションでフィルター処理するイベントの種類の名前を追加し、サブスクリプションで使用するコンテキスト属性フィルターを追加します。 次に、ページの下部にある [次へ: 追加の機能] を選択します。

    Event Grid のイベント サブスクリプションのフィルター作成を示すスクリーンショット。

  6. [追加機能] タブでは、イベント リテンション期間、最大配信回数、ロック期間、配信不能設定を指定できます。

    Event Grid のイベント サブスクリプションの追加機能作成を示すスクリーンショット。

  7. [作成] を選び、イベント サブスクリプションを作成します。

Azure に対してアプリを認証する

このクイック スタートでは、Azure Event Grid: 接続文字列 に接続する 2 つの方法を示します。 このセクションでは、接続文字列を使用して Event Grid 名前空間に接続する方法を示します。 Azure を初めて使用する場合は、接続文字列オプションの方が簡単に理解できます。 新しい Event Grid 名前空間を作成すると、プライマリ キーとセカンダリ キーが自動的に生成され、あらゆる角度から名前空間を完全に制御することが可能になります。 クライアントは、接続文字列を使用して Event Grid 名前空間に接続できます。 名前空間トピックのアクセスキーをコピーするには、次の手順を実行します:

  1. [Event Grid 名前空間] ページで、[トピック] を選択します。

  2. アクセスする必要があるトピックを選択します。

  3. [アクセス キー] ページで、キー 1 または キー 2 の横にあるコピー ボタンを選択して、後で使用するためにアクセス キーをクリップボードにコピーします。 この値をメモ帳などに一時的に貼り付けます。

    Event Grid トピックのアクセス キーを示すスクリーンショット。

Visual Studio を起動する

Visual Studio を起動します。 [作業の開始] ウィンドウが表示されたら、右側のウィンドウで [コードなしで続行] リンクを選択します。

トピックにメッセージを送信する

このセクションでは、Event Grid トピックにメッセージを送信する .NET コンソール アプリケーションを作成する方法を示します。

コンソール アプリケーションの作成

  1. Visual Studio で、[ファイル] ->[新規作成] ->[プロジェクト] メニューを選択します。

  2. **[新しいプロジェクトの作成]** ダイアログ ボックスで、次の手順に従います。このダイアログ ボックスが表示されない場合は、メニューで **[ファイル]****[新規]****[プロジェクト]** の順に選択します。

    1. プログラミング言語として **[C#]** を選択します。

    2. アプリケーションの種類として [コンソール] を選択します。

    3. 結果の一覧から [コンソール アプリ] を選択します。

    4. 次に、 [次へ] を選択します。

      [C#] と [コンソール] が選択された [新しいプロジェクトの作成] ダイアログ ボックスを示すスクリーンショット。

  3. プロジェクト名として「EventSender」、ソリューション名として「EventGridQuickStart」と入力してから、[次へ] を選択します。

    [新しいプロジェクトの構成] ダイアログ ボックスのソリューション名とプロジェクト名を示すスクリーンショット。

  4. [追加情報] ページで、 [作成] を選択してソリューションとプロジェクトを作成します。

NuGet パッケージをプロジェクトに追加する

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. 次のコマンドを実行して、Azure.Messaging.EventGrid NuGet パッケージをインストールします:

    Install-Package Azure.Messaging.EventGrid.Namespaces
    

名前空間トピックにイベントを送信するコードを追加する

  1. Program.cs の内容を以下のコードに置き換えます。 重要な手順の概要を示します。コード コメントに追加情報が記載されています。

    重要

    名前空間エンドポイント、トピック名、トピック キーを使用して、コード スニペットのプレースホルダー値 (<NAMESPACE-ENDPOINT><TOPIC-NAME><TOPIC-ACCESS-KEY><TOPIC-SUBSCRIPTION-NAME>) を更新します。

    using Azure.Messaging;
    using Azure;
    using Azure.Messaging.EventGrid.Namespaces;
    
    
    // TODO: Replace the following placeholders with appropriate values
    
    // Endpoint of the namespace that you can find on the Overview page for your Event Grid namespace. Prefix it with https://.
    // Should be in the form: https://namespace01.eastus-1.eventgrid.azure.net. 
    var namespaceEndpoint = "<NAMESPACE-ENDPOINT>";
    
    // Name of the topic in the namespace
    var topicName = "<TOPIC-NAME>";
    
    // Access key for the topic
    var topicKey = "<TOPIC-ACCESS-KEY>";
    
    // Construct the client using an Endpoint for a namespace as well as the access key
    var client = new EventGridSenderClient(new Uri(namespaceEndpoint), topicName, new AzureKeyCredential(topicKey));
    
    // Publish a single CloudEvent using a custom TestModel for the event data.
    var @ev = new CloudEvent("employee_source", "type", new TestModel { Name = "Bob", Age = 18 });
    await client.SendAsync(ev);
    
    // Publish a batch of CloudEvents.
    
    await client.SendAsync(
    new[] {
        new CloudEvent("employee_source", "type", new TestModel { Name = "Tom", Age = 55 }),
        new CloudEvent("employee_source", "type", new TestModel { Name = "Alice", Age = 25 })});
    
    Console.WriteLine("Three events have been published to the topic. Press any key to end the application.");
    Console.ReadKey();
    
    public class TestModel
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    
  2. プロジェクトをビルドし、エラーがないことを確認します。

  3. プログラムを実行し、確認メッセージが表示されるまで待ちます。

    Three events have been published to the topic. Press any key to end the application.
    

    重要

    ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1、2 分です。 まれに、最大 8 分かかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。

  4. Azure portal で次の手順を実行します。

    1. Event Grid 名前空間に移動します。

    2. [概要] ページには、名前空間に投稿されたイベントの数がグラフに表示されます。

      Microsoft Azure portal の [Event Grid 名前空間] ページを示すスクリーンショット。

トピックからメッセージをプルする

このセクションでは、トピックからメッセージを受信する .NET コンソール アプリケーションを作成します。

公開された CloudEvents を受け取るプロジェクトを作成する

  1. ソリューション エクスプローラー ウィンドウで、[EventGridQuickStart] ソリューションを右クリックし、[追加] をポイントして、[新規プロジェクト] を選択します。
  2. [コンソール アプリケーション] を選択し、 [次へ] を選択します。
  3. [プロジェクト名] に「EventReceiver」と入力し、[作成] を選択します。
  4. ソリューション エクスプローラー ウィンドウで、[EventReceiver] を右クリックし、[スタートアップ プロジェクトとして設定] を選択します。

NuGet パッケージをプロジェクトに追加する

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. 次のコマンドを実行して、Azure.Messaging.EventGrid NuGet パッケージをインストールします。 既定のプロジェクトがまだ設定されていない場合は、EventReceiver を選択します。

    Install-Package Azure.Messaging.EventGrid.Namespaces
    

    パッケージ マネージャー コンソールで選択された EventReceiver プロジェクトを示すスクリーンショット。

トピックからイベントを受信するコードを追加する

このセクションでは、キューからメッセージを取得するコードを追加します。

  1. Program クラス内に、次のコードを追加します。

    重要

    コード スニペット内のプレースホルダー値 (<NAMESPACE-ENDPOINT><TOPIC-NAME><TOPIC-ACCESS-KEY><TOPIC-SUBSCRIPTION-NAME>) を名前空間エンドポイント、トピック名、トピック キー、トピックのサブスクリプション名で更新します。

    using Azure;
    using Azure.Messaging;
    using Azure.Messaging.EventGrid.Namespaces;
    
    // TODO: Replace the following placeholders with appropriate values
    
    // Endpoint of the namespace that you can find on the Overview page for your Event Grid namespace
    // Example: https://namespace01.eastus-1.eventgrid.azure.net. 
    var namespaceEndpoint = "<NAMESPACE-ENDPOINT>"; // Should be in the form: https://namespace01.eastus-1.eventgrid.azure.net. 
    
    // Name of the topic in the namespace
    var topicName = "<TOPIC-NAME>";
    
    // Access key for the topic
    var topicKey = "<TOPIC-ACCESS-KEY>";
    
    // Name of the subscription to the topic
    var subscriptionName = "<TOPIC-SUBSCRIPTION-NAME>";
    
    // Maximum number of events you want to receive
    const short MaxEventCount = 3;
    
    // Construct the client using an Endpoint for a namespace as well as the access key
    var client = new EventGridReceiverClient(new Uri(namespaceEndpoint), topicName, subscriptionName, new AzureKeyCredential(topicKey));
    
    // Receive the published CloudEvents. 
    ReceiveResult result = await client.ReceiveAsync(MaxEventCount);
    
    Console.WriteLine("Received Response");
    Console.WriteLine("-----------------");
    
    
  2. Program クラスの末尾に次のメソッドを追加します。

    // handle received messages. Define these variables on the top.
    
    var toRelease = new List<string>();
    var toAcknowledge = new List<string>();
    var toReject = new List<string>();
    
    // Iterate through the results and collect the lock tokens for events we want to release/acknowledge/result
    
    foreach (ReceiveDetails detail in result.Details)
    {
        CloudEvent @event = detail.Event;
        BrokerProperties brokerProperties = detail.BrokerProperties;
        Console.WriteLine(@event.Data.ToString());
    
        // The lock token is used to acknowledge, reject or release the event
        Console.WriteLine(brokerProperties.LockToken);
        Console.WriteLine();
    
        // If the event is from the "employee_source" and the name is "Bob", we are not able to acknowledge it yet, so we release it
        if (@event.Source == "employee_source" && @event.Data.ToObjectFromJson<TestModel>().Name == "Bob")
        {
            toRelease.Add(brokerProperties.LockToken);
        }
        // acknowledge other employee_source events
        else if (@event.Source == "employee_source")
        {
            toAcknowledge.Add(brokerProperties.LockToken);
        }
        // reject all other events
        else
        {
            toReject.Add(brokerProperties.LockToken);
        }
    }
    
    // Release/acknowledge/reject the events
    
    if (toRelease.Count > 0)
    {
        ReleaseResult releaseResult = await client.ReleaseAsync(toRelease);
    
        // Inspect the Release result
        Console.WriteLine($"Failed count for Release: {releaseResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in releaseResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Release: {releaseResult.SucceededLockTokens.Count}");
        foreach (string lockToken in releaseResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    if (toAcknowledge.Count > 0)
    {
        AcknowledgeResult acknowledgeResult = await client.AcknowledgeAsync(toAcknowledge);
    
        // Inspect the Acknowledge result
        Console.WriteLine($"Failed count for Acknowledge: {acknowledgeResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in acknowledgeResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Acknowledge: {acknowledgeResult.SucceededLockTokens.Count}");
        foreach (string lockToken in acknowledgeResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    if (toReject.Count > 0)
    {
        RejectResult rejectResult = await client.RejectAsync(toReject);
    
        // Inspect the Reject result
        Console.WriteLine($"Failed count for Reject: {rejectResult.FailedLockTokens.Count}");
        foreach (FailedLockToken failedLockToken in rejectResult.FailedLockTokens)
        {
            Console.WriteLine($"Lock Token: {failedLockToken.LockToken}");
            Console.WriteLine($"Error Code: {failedLockToken.Error}");
            Console.WriteLine($"Error Description: {failedLockToken.ToString}");
        }
    
        Console.WriteLine($"Success count for Reject: {rejectResult.SucceededLockTokens.Count}");
        foreach (string lockToken in rejectResult.SucceededLockTokens)
        {
            Console.WriteLine($"Lock Token: {lockToken}");
        }
        Console.WriteLine();
    }
    
    public class TestModel
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }    
    
    
  3. ソリューション エクスプローラー ウィンドウで、[EventReceiver] プロジェクトを右クリックし、[スタートアップ プロジェクトとして設定] を選択します。

  4. プロジェクトをビルドし、エラーがないことを確認します。

  5. EventReceiver アプリケーションを実行し、出力ウィンドウに 3 つのイベントが表示されているのを確認します。

    Receiver アプリからの出力を示すスクリーンショット。

リソースをクリーンアップする

Microsoft Azure portal で Event Grid 名前空間に移動し、Azure portal で [削除] を選択して名前空間とそのトピックを削除します。

.NET API 機能」を参照してください。