共用方式為


如何將事件從 Azure SignalR Service 傳送至事件方格

「Azure 事件方格」是一個完全受控的事件路由服務,可使用發佈-訂閱模型來提供統一的事件耗用。 在此指南中,您可以使用 Azure CLI 來建立 Azure SignalR Service、訂閱連線事件,然後部署範例 Web 應用程式來接收事件。 最後,您可以連線和中斷連線,並在範例應用程式中查看事件承載。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

  • 本文中的 Azure CLI 命令已針對 Bash 殼層進行格式化。 如果您使用不同的殼層 (例如 PowerShell 或命令提示字元),您可能需要據以調整行接續字元或變數指派行。 本文使用變數來將需要編輯的命令數量降至最低。

建立資源群組

Azure 資源群組是一種邏輯容器,您可在其中部署與管理 Azure 資源。 命令 az group create 會在 eastus 地區中建立一個名為 myResourceGroup 的資源群組。 如果您想要針對資源群組使用不同名稱,請將 RESOURCE_GROUP_NAME 設定為不同的值。

RESOURCE_GROUP_NAME=myResourceGroup

az group create --name $RESOURCE_GROUP_NAME --location eastus

建立 SignalR 服務

接下來,使用下列命令來將 Azure Signals Service 部署至該資源群組。

SIGNALR_NAME=SignalRTestSvc

az signalr create --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --sku Free_F1

一旦建立 SignalR Service 之後,Azure CLI 就會傳回類似下列範例的輸出:

{
  "externalIp": "13.76.156.152",
  "hostName": "clitest.servicedev.signalr.net",
  "hostNamePrefix": "clitest",
  "id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/clitest1/providers/Microsoft.SignalRService/SignalR/clitest",
  "location": "southeastasia",
  "name": "clitest",
  "provisioningState": "Succeeded",
  "publicPort": 443,
  "resourceGroup": "clitest1",
  "serverPort": 443,
  "sku": {
    "capacity": 1,
    "family": null,
    "name": "Free_F1",
    "size": "F1",
    "tier": "Free"
  },
  "tags": null,
  "type": "Microsoft.SignalRService/SignalR",
  "version": "1.0"
}

建立事件端點

在本節中,您可以使用位於 GitHub 存放庫的 Resource Manager 範本,來將預先建置的範例 Web 應用程式部署到 Azure App Service。 您稍後會訂閱登錄的事件方格事件,並指定此應用程式作為要將事件傳送至其中的端點。

若要部署範例應用程式,請將 SITE_NAME 設為您 Web 應用程式的唯一名稱,然後執行下列命令。 網站名稱在 Azure 中必須是唯一的,因為它會構成 Web 應用程式完整網域名稱 (FQDN) 的一部分。 在後續小節中,您會在網頁瀏覽器中瀏覽至應用程式的 FQDN,以檢視您的登錄事件。

SITE_NAME=<your-site-name>

az deployment group create \
    --resource-group $RESOURCE_GROUP_NAME \
    --template-uri "https://raw.githubusercontent.com/Azure-Samples/azure-event-grid-viewer/master/azuredeploy.json" \
    --parameters siteName=$SITE_NAME hostingPlanName=$SITE_NAME-plan

成功部署 (可能需要幾分鐘的時間) 之後,請開啟瀏覽器,然後移至您的 Web 應用程式以確定它正在執行:

http://<your-site-name>.azurewebsites.net

啟用事件方格資源提供者

  1. 如果您先前在 Azure 訂用帳戶中從未使用過事件方格,可能必須註冊事件方格資源提供者。 執行下列命令以註冊提供者:

    az provider register --namespace Microsoft.EventGrid
    
  2. 可能需要一點時間才能完成註冊。 若要檢查狀態,請執行下列命令:

    az provider show --namespace Microsoft.EventGrid --query "registrationState"
    

    registrationStateRegistered 時,代表已準備好繼續進行。

訂閱登錄事件

在事件方格中,您可以訂閱「主題」,以告知它您想要追蹤的事件,以及要將它們傳送至何處。 下列的 az eventgrid event-subscription create 命令會訂閱您所建立的 Azure SignalR Service,並指定您的 Web 應用程式 URL 做為其應將事件傳送至其中的端點。 您在先前小節中所填入的環境變數會在此處重複使用,因此不需進行任何編輯。

SIGNALR_SERVICE_ID=$(az signalr show --resource-group $RESOURCE_GROUP_NAME --name $SIGNALR_NAME --query id --output tsv)
APP_ENDPOINT=https://$SITE_NAME.azurewebsites.net/api/updates

az eventgrid event-subscription create \
    --name event-sub-signalr \
    --source-resource-id $SIGNALR_SERVICE_ID \
    --endpoint $APP_ENDPOINT

完成訂閱時,您應該會看見類似下列範例的輸出:

{
  "deadLetterDestination": null,
  "destination": {
    "endpointBaseUrl": "https://$SITE_NAME.azurewebsites.net/api/updates",
    "endpointType": "WebHook",
    "endpointUrl": null
  },
  "filter": {
    "includedEventTypes": [
      "Microsoft.SignalRService.ClientConnectionConnected",
      "Microsoft.SignalRService.ClientConnectionDisconnected"
    ],
    "isSubjectCaseSensitive": null,
    "subjectBeginsWith": "",
    "subjectEndsWith": ""
  },
  "id": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/Microsoft.SignalRService/SignalR/SignalRTestSvc/providers/Microsoft.EventGrid/eventSubscriptions/event-sub-signalr",
  "labels": null,
  "name": "event-sub-signalr",
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroup",
  "retryPolicy": {
    "eventTimeToLiveInMinutes": 1440,
    "maxDeliveryAttempts": 30
  },
  "topic": "/subscriptions/28cf13e2-c598-4aa9-b8c8-098441f0827a/resourceGroups/myResourceGroup/providers/microsoft.signalrservice/signalr/SignalRTestSvc",
  "type": "Microsoft.EventGrid/eventSubscriptions"
}

觸發登錄事件

將服務模式切換為 Serverless Mode,並設定與 SignalR Service 的用戶端連線。 您可以採用無伺服器範例作為參考。

git clone git@github.com:aspnet/AzureSignalR-samples.git

cd samples/Management

# Start the negotiation server
# Negotiation server is responsible for generating access token for clients
cd NegotitationServer
dotnet user-secrets set Azure:SignalR:ConnectionString "<Connection String>"
dotnet run

# Use a separate command line
# Start a client
cd SignalRClient
dotnet run

檢視登錄事件

您現在已將用戶端連線到 SignalR Service。 瀏覽至您的事件方格檢視器 Web 應用程式,而您應該會看到 ClientConnectionConnected 事件。 如果您終止該用戶端,您也會看到 ClientConnectionDisconnected 事件。