此參考說明如何在 Azure Functions 中處理 Web PubSub 事件。
Web PubSub 是一項 Azure 受控服務,可協助開發人員輕鬆建置具有即時功能和發佈/訂閱模式的 Web 應用程式。
| 動作 | 類型 |
|---|---|
| 當服務發出訊息時,執行函式 | 觸發程序繫結 |
| 將要求繫結至 HTTP 觸發程序下的目標物件,以進行交涉和上游要求 | 輸入繫結 |
| 叫用服務執行動作 | 輸出繫結 |
原始程式碼 | 套件 | API 參考文件 | 產品文件 | 範例
新增至函數應用程式
您需要參考適當的套件,才能使用觸發程序和繫結。 NuGet 套件用於 .NET 類別庫,而擴充套件組合則用於所有其他應用程式類型。
| 語言 | 新增者... |
|---|---|
| C# | 安裝 NuGet 套件,以特定版本為目標 |
| JavaScript、Python、PowerShell、C# 腳本(僅限 Azure 入口網站) | 使用延伸模組套件組合 (建議), 明確安裝擴充功能 |
重要概念
(1)-(2) WebPubSubConnection 輸入與 HttpTrigger 繫結,以產生用戶端連線。
(3)-(4) WebPubSubTrigger 觸發程序繫結,或 WebPubSubContext 輸入與 HttpTrigger 繫結,以處理服務要求。
(5)-(6) WebPubSub 輸出繫結,以要求服務執行某些動作。
觸發程序繫結
使用函式觸發程序處理來自 Azure Web PubSub 服務的要求。
當您需要處理來自服務端的要求時,會使用 WebPubSubTrigger。 觸發程序端點模式如下所示,此模式應該在 Web PubSub 服務端中設定 (入口網站:設定 -> 事件處理常式 -> URL 範本)。 在端點模式中,當您基於code=<API_KEY>考量使用 Azure Function 應用程式時,需要使用查詢組件 。 可以在 Azure 入口網站中找到該金鑰。 尋找函式應用程式資源,並在將函式應用程式部署至 Azure 之後,瀏覽至函式 ->應用程式金鑰 ->系統金鑰 ->webpubsub_extension。 不過,當您使用本機函式時,不需要此金鑰。
<Function_App_Url>/runtime/webhooks/webpubsub?code=<API_KEY>
範例
[FunctionName("WebPubSubTrigger")]
public static void Run(
[WebPubSubTrigger("<hub>", WebPubSubEventType.User, "message")] UserEventRequest request, ILogger log)
{
log.LogInformation($"Request from: {request.ConnectionContext.UserId}");
log.LogInformation($"Request message data: {request.Data}");
log.LogInformation($"Request message dataType: {request.DataType}");
}
當伺服器可以檢查和拒絕用戶端要求,或直接將訊息傳送給呼叫者端時,WebPubSubTrigger 繫結也支援同步處理情節中的傳回值 (例如,系統 Connect 和使用者事件)。
Connect 事件遵守 ConnectEventResponse 和 EventErrorResponse,而使用者事件遵守 UserEventResponse 和 EventErrorResponse,不符合目前情節的 rest 型別會予以忽略。 如果傳回 EventErrorResponse,服務會卸除用戶端連線。
[FunctionName("WebPubSubTriggerReturnValueFunction")]
public static UserEventResponse Run(
[WebPubSubTrigger("hub", WebPubSubEventType.User, "message")] UserEventRequest request)
{
return request.CreateResponse(BinaryData.FromString("ack"), WebPubSubDataType.Text);
}
屬性和註釋
在 C# 類別庫中,使用 WebPubSubTrigger 屬性。
以下是方法簽章中的 WebPubSubTrigger 屬性:
[FunctionName("WebPubSubTrigger")]
public static void Run([WebPubSubTrigger("<hub>", <WebPubSubEventType>, "<event-name>")]
WebPubSubConnectionContext context, ILogger log)
{
...
}
如需完整範例,請參閱 C# 範例。
組態
下表說明您在 function.json 檔案中設定的繫結設定屬性。
| function.json 屬性 | 屬性內容 | 描述 |
|---|---|---|
| 類型 | n/a | 必要項目 - 必須設定為 webPubSubTrigger。 |
| 方向 | n/a | 必要項目 - 必須設定為 in。 |
| 名字 | n/a | 必要項目 - 函式程式碼中用於接收事件資料之參數的變數名稱。 |
| 中樞 | 中樞 | 必要 - 針對要觸發的函式,此值必須設為其 Web PubSub 中樞的名稱。 我們支援將屬性中的該值設定為較高的優先順序,或者可以在應用程式設定中將其設定為全域值。 |
| 事件類型 | WebPubSubEventType | 必要 - 針對要觸發的函式,此值必須設為其訊息事件類型。 該值應為 user 或 system。 |
| eventName | 事件名稱 | 必要 - 針對要觸發的函式,此值必須設為其訊息事件。
針對 system 事件類型,事件名稱應位於 connect、connected、disconnected 中。
針對使用者定義的子通訊協定,事件名稱為 message。
針對系統支援的子通訊協定 json.webpubsub.azure.v1.,事件名稱為使用者定義的事件名稱。 |
| 連接 | Connection | 選擇性 - 指定上游 Azure Web PubSub 服務的應用程式設定名稱或設定集合名稱。 此值用於簽章驗證。 而且此值依預設會使用應用程式設定「WebPubSubConnectionString」進行自動解析。 這意味著 null 不需要驗證並且總是成功。 |
使用方式
在 C# 中,WebPubSubEventRequest 為已辨識型別繫結參數,剩餘參數則會由參數名稱繫結。 請查看下表,以取得可用的參數和型別。
在類似 JavaScript 的弱型別語言中,name 中的 function.json 會用來繫結與以下對應表有關的觸發程序物件。 當 dataType 設定為 function.json (作為觸發程序輸入的繫結物件) 時,會遵守 name 中的 data,以據此轉換訊息。 所有參數都可以從 context.bindingData.<BindingName> 進行讀取,而且會進行 JObject 轉換。
| 繫結名稱 | 繫結類型 | 描述 | 屬性 |
|---|---|---|---|
| 要求 | WebPubSubEventRequest |
描述上游要求 | 屬性會因不同的事件類型而有所不同,包括衍生類別 ConnectEventRequest、ConnectedEventRequest、UserEventRequest 和 DisconnectedEventRequest |
| connectionContext | WebPubSubConnectionContext |
一般要求資訊 | EventType、EventName、Hub、ConnectionId、UserId、Headers、Origin、Signature、States |
| 資料 |
BinaryData、string、Stream、byte[] |
在使用者 message 事件中向用戶端要求訊息資料 |
- |
| 數據類型 | WebPubSubDataType |
要求訊息 dataType,支援 binary、text、json |
- |
| claims | IDictionary<string, string[]> |
系統 connect 要求中的使用者宣告 |
- |
| 查詢 | IDictionary<string, string[]> |
系統 connect 要求中的使用者查詢 |
- |
| 子通訊協定 | IList<string> |
系統 connect 要求中可用的子通訊協定 |
- |
| 用戶端憑證 | IList<ClientCertificate> |
系統 connect 要求中用戶端的憑證指紋清單 |
- |
| 原因 | string |
系統 disconnected 要求中的原因 |
- |
重要事項
在 C# 中,支援多個型別的參數必須放在第一個,也就是預設 request 型別以外的 data 或 BinaryData 參數,讓函式正確繫結。
傳回回應
WebPubSubTrigger 會遵守客戶針對 connect 的同步事件和使用者事件所傳回的回應。 只有相符的回應會傳回至服務,否則會將其忽略。 此外,WebPubSubTrigger 傳回物件支援使用者 SetState() 及 ClearStates(),以管理連線的中繼資料。 延伸模組會將傳回值的結果與來自要求 WebPubSubConnectionContext.States 的原始結果合併。 現有索引鍵中的值會覆寫,並新增新索引鍵中的值。
| 傳回類型 | 描述 | 屬性 |
|---|---|---|
ConnectEventResponse |
connect 事件的回應 |
Groups、Roles、UserId、Subprotocol |
UserEventResponse |
使用者事件的回應 | DataType、Data |
EventErrorResponse |
同步事件的錯誤回應 | Code、ErrorMessage |
*WebPubSubEventResponse |
支援的基本回應類型 (適用於不確定傳回案例) | - |
輸入繫結
我們的延伸模組提供兩個以不同需求為目標的輸入繫結。
WebPubSubConnection若要讓用戶端連線到 Azure Web PubSub 服務,它必須知道服務端點 URL 和有效的存取權杖。
WebPubSubConnection輸入繫結會產生必要的資訊,因此用戶端本身不需要處理這個權杖產生。 因為權杖是限時的,且可用來驗證連線的特定使用者,所以請不要快取權杖或者在用戶端之間共用權杖。 搭配此輸入繫結使用的 HTTP 觸發程序可以供用戶端用來擷取連線資訊。WebPubSubContext使用 Static Web Apps 時,
HttpTrigger是唯一支援的觸發程序,而且在 Web PubSub 情節下,我們提供WebPubSubContext輸入繫結,可協助使用者從 Web PubSub 通訊協定下的服務端還原序列化上游 HTTP 要求。 因此,與WebPubSubTrigger比較,客戶可以取得類似的結果,以便輕鬆地在函式中處理。 請參閱下面的範例。 搭配HttpTrigger使用時,客戶必須相應地在事件處理常式中設定 HttpTrigger 公開 URL。
範例 - WebPubSubConnection
以下範例示範 C# 函式,該函式會使用輸入繫結來取得 Web PubSub 連線資訊,並且透過 HTTP 傳回。 在以下範例中,UserId 會透過用戶端要求查詢組件傳入,例如 ?userid={User-A}。
[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubConnection(Hub = "<hub>", UserId = "{query.userid}")] WebPubSubConnection connection)
{
return connection;
}
已驗證權杖
如果函式是由已驗證的用戶端觸發,您可以將使用者識別碼宣告新增至產生的權杖。 您可以使用 [App Service 驗證],輕鬆地將驗證新增至函數應用程式。
App Service 驗證會設定名為 x-ms-client-principal-id 和 x-ms-client-principal-name 的 HTTP 標頭,這些標頭分別包含已驗證使用者的用戶端主體識別碼和名稱。
您可以使用繫結運算式 ({headers.x-ms-client-principal-id} 或 {headers.x-ms-client-principal-name}),將繫結的 UserId 屬性設為任一標頭的值。
[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubConnection(Hub = "<hub>", UserId = "{headers.x-ms-client-principal-name}")] WebPubSubConnection connection)
{
return connection;
}
附註
由於繫結參數類型不支援傳遞清單或陣列的方式,因此伺服器 SDK 中的 WebPubSubConnection 與所有參數並不完全相容,特別是 roles,還包括 groups 和 expiresAfter。 如果客戶需要在函式中新增角色或延遲建置存取權杖,建議使用適用於 C# 的伺服器 SDK。
[FunctionName("WebPubSubConnectionCustomRoles")]
public static async Task<Uri> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
var serviceClient = new WebPubSubServiceClient(new Uri(endpoint), "<hub>", "<web-pubsub-connection-string>");
var userId = req.Query["userid"].FirstOrDefault();
// your method to get custom roles.
var roles = GetRoles(userId);
return await serviceClient.GetClientAccessUriAsync(TimeSpan.FromMinutes(5), userId, roles);
}
範例 - WebPubSubContext
以下範例示範 C# 函式,該函式會使用 connect 事件類型下的輸入繫結來取得 Web PubSub 上游要求資訊,並且透過 HTTP 將其傳回。
[FunctionName("WebPubSubContextInputBinding")]
public static object Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubContext] WebPubSubContext wpsContext)
{
// in the case request is a preflight or invalid, directly return prebuild response by extension.
if (wpsContext.IsPreflight || wpsContext.HasError)
{
return wpsContext.Response;
}
var request = wpsContext.Request as ConnectEventRequest;
var response = new ConnectEventResponse
{
UserId = wpsContext.Request.ConnectionContext.UserId
};
return response;
}
組態
WebPubSubConnection
下表說明您在 function.json 檔案中設定的繫結設定屬性內容和 WebPubSubConnection 屬性。
| function.json 屬性 | 屬性內容 | 描述 |
|---|---|---|
| 類型 | n/a | 必須設定為 webPubSubConnection |
| 方向 | n/a | 必須設定為 in |
| 名字 | n/a | 函式程式碼中用於輸入連線繫結物件的變數名稱。 |
| 中樞 | 中樞 | 必要 - 針對要觸發的函式,此值必須設為其 Web PubSub 中樞的名稱。 我們支援將屬性中的該值設定為較高的優先順序,或者可以在應用程式設定中將其設定為全域值。 |
| userId | UserId | 選擇性:要在存取金鑰權杖中設定的使用者識別碼宣告值。 |
| 連接 | Connection | 必要 - 包含 Web PubSub 服務連接字串的應用程式設定名稱 (預設值為「WebPubSubConnectionString」)。 |
WebPubSubContext
下表說明您在 function.json 檔案中設定的繫結設定屬性內容和 WebPubSubContext 屬性。
| function.json 屬性 | 屬性內容 | 描述 |
|---|---|---|
| 類型 | n/a | 必須設為 webPubSubContext。 |
| 方向 | n/a | 必須設為 in。 |
| 名字 | n/a | 函式程式碼中用於輸入 Web PubSub 要求的變數名稱。 |
| 連接 | Connection | 選擇性 - 指定上游 Azure Web PubSub 服務的應用程式設定名稱或設定集合名稱。 此值用於濫用保護和簽章驗證。 此值預設為使用「WebPubSubConnectionString」進行自動解析。 這意味著 null 不需要驗證並且總是成功。 |
使用量
WebPubSubConnection
WebPubSubConnection 提供下列屬性。
| 繫結名稱 | 繫結類型 | 描述 |
|---|---|---|
| BaseUri | Uri | Web PubSub 用戶端連線 URI。 |
| Uri | Uri | Web PubSub 連線的絕對 URI,其中包含根據要求所產生的 AccessToken。 |
| AccessToken | 字串 | 根據要求 UserId 和服務資訊所產生的 AccessToken。 |
WebPubSubContext
WebPubSubContext 提供下列屬性。
| 繫結名稱 | 繫結類型 | 描述 | 屬性 |
|---|---|---|---|
| 要求 | WebPubSubEventRequest |
用戶端要求,請參閱下表以取得詳細資料。 |
要求標頭的 WebPubSubConnectionContext 與其他從要求本文還原序列化的屬性可描述要求,例如,適用於 Reason 的 DisconnectedEventRequest。 |
| 回應 | HttpResponseMessage |
延伸模組主要會針對 AbuseProtection 和錯誤案例建置回應。 |
- |
| 錯誤消息 | 字串 | 描述處理上游要求時的錯誤詳細資料。 | - |
| hasError | 布爾 (bool) | 旗標,指出它是否為有效的 Web PubSub 上游要求。 | - |
| isPreflight | 布爾 (bool) | 旗標,指出它是否為 AbuseProtection 的預檢要求。 |
- |
針對 WebPubSubEventRequest,它會還原序列化為不同類別,以提供有關要求情節的不同資訊。 若為 PreflightRequest 或無效案例,使用者可以檢查旗標 IsPreflight 與 HasError 以進行了解。 建議您直接傳回系統組建回應 WebPubSubContext.Response,或客戶可以視需要記錄錯誤。 在不同的情節中,客戶可以讀取要求屬性,如下所示。
| 衍生類別 | 描述 | 屬性 |
|---|---|---|
PreflightRequest |
用於 AbuseProtection (當 IsPreflight 為 true 時) |
- |
ConnectEventRequest |
用於系統 Connect 事件類型 |
Claims、Query、Subprotocols、ClientCertificates |
ConnectedEventRequest |
用於系統 Connected 事件類型 |
- |
UserEventRequest |
用於使用者事件類型 | Data、DataType |
DisconnectedEventRequest |
用於系統 Disconnected 事件類型 |
原因 |
附註
雖然 WebPubSubContext 作為一個輸入繫結在 HttpTrigger 下提供與 WebPubSubTrigger 類似的請求反序列化方法,但仍然存在限制,即不支援合併後的連接狀態。 服務端仍會遵守傳回回應,但使用者需要自行建置回應。 如果使用者必須設定事件回應,您應該傳回包含 HttpResponseMessage 的 ConnectEventResponse,或者使用者事件的訊息作為回應本文,並將具有索引鍵 ce-connectionstate 的連線狀態,放在回應標頭中。
輸出繫結
使用 Web PubSub 輸出繫結來叫用 Azure Web PubSub 服務,以執行某些動作。 您可以將訊息廣播至:
- 所有已連線的用戶端
- 將以驗證的用戶端連線至特定使用者
- 已加入特定群組的已連線用戶端
- 特定用戶端連線
輸出繫結也可讓您管理用戶端和群組,以及以群組特定 connectionId 為目標的授與/撤銷權限。
- 將連線新增至群組
- 將使用者新增至群組
- 從群組移除連線
- 移除群組中的使用者
- 從所有群組中移除使用者
- 關閉所有用戶端連線
- 關閉特定用戶端連線
- 關閉群組中的連線
- 連線的授與權限
- 連線的撤銷權限
如需安裝和設定細節的相關資訊,請參閱概觀。
範例
[FunctionName("WebPubSubOutputBinding")]
public static async Task RunAsync(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSub(Hub = "<hub>")] IAsyncCollector<WebPubSubAction> actions)
{
await actions.AddAsync(WebPubSubAction.CreateSendToAllAction("Hello Web PubSub!", WebPubSubDataType.Text));
}
WebPubSubAction
WebPubSubAction 是輸出繫結的基本抽象類型。 衍生型別代表動作伺服器希望服務進行叫用。
在 C# 語言中,我們在 WebPubSubAction 下提供了一些靜態方法,以協助探索可用的動作。 例如,使用者可以透過呼叫 SendToAllAction 來建立 WebPubSubAction.CreateSendToAllAction()。
| 衍生類別 | 屬性 |
|---|---|
SendToAllAction |
Data、DataType、Excluded |
SendToGroupAction |
Group、Data、DataType、Excluded |
SendToUserAction |
UserId、Data、DataType |
SendToConnectionAction |
ConnectionId、Data、DataType |
AddUserToGroupAction |
UserId、Group |
RemoveUserFromGroupAction |
UserId、Group |
RemoveUserFromAllGroupsAction |
UserId |
AddConnectionToGroupAction |
ConnectionId、Group |
RemoveConnectionFromGroupAction |
ConnectionId、Group |
CloseAllConnectionsAction |
Excluded、Reason |
CloseClientConnectionAction |
ConnectionId、Reason |
CloseGroupConnectionsAction |
Group、Excluded、Reason |
GrantPermissionAction |
ConnectionId、Permission、TargetName |
RevokePermissionAction |
ConnectionId、Permission、TargetName |
組態
WebPubSub
下表說明您在 function.json 檔案中設定的繫結設定屬性內容和 WebPubSub 屬性。
| function.json 屬性 | 屬性內容 | 描述 |
|---|---|---|
| 類型 | n/a | 必須設定為 webPubSub |
| 方向 | n/a | 必須設定為 out |
| 名字 | n/a | 函式程式碼中用於輸出繫結物件的變數名稱。 |
| 中樞 | 中樞 | 針對要觸發的函式,此值必須設為其 Web PubSub 中樞的名稱。 我們支援將屬性中的該值設定為較高的優先順序,或者可以在應用程式設定中將其設定為全域值。 |
| 連接 | Connection | 包含 Web PubSub 服務連接字串的應用程式設定名稱 (預設值為「WebPubSubConnectionString」)。 |
疑難排解
設定主控台記錄
如果您想要深入了解針對服務提出的要求,您也可以輕鬆地啟用主控台記錄。
後續步驟
使用這些資源開始建置自己的應用程式: