Desencadenador y enlaces de Azure Web PubSub para Azure Functions
En esta referencia se explica cómo controlar eventos de Web PubSub en Azure Functions.
Web PubSub es un servicio administrado de Azure que ayuda a los desarrolladores a compilar fácilmente aplicaciones web con características en tiempo real y con el patrón de publicación-suscripción.
Action | Tipo |
---|---|
Ejecutar una función cuando los mensajes proceden del servicio | Enlace del desencadenador |
Enlace de la solicitud al objeto de destino en el desencadenador HTTP para la negociación y las solicitudes ascendentes | Enlace de entrada |
Invocación de acciones Do del servicio | Enlace de salida |
Código fuente | Paquete | Documentación de referencia de API | Documentación del producto | Ejemplos
Adición a la aplicación de Functions
Para trabajar con el desencadenador y los enlaces, es necesario hacer referencia al paquete adecuado. En las bibliotecas de clases de .NET se usa el paquete NuGet, mientras que en los demás tipos de aplicaciones se emplea el conjunto de extensiones.
Lenguaje | Agregar mediante... | Comentarios |
---|---|---|
C# | Instalación del paquete NuGet, versión preliminar | |
Script de C#, JavaScript, Python, PowerShell | Instalación explícita de extensiones, Uso de conjuntos de extensiones | Se recomienda usar la extensión Azure Tools con Visual Studio Code. |
Script de C# (solo en línea en Azure Portal) | Adición de un enlace | Para actualizar extensiones de enlace existentes sin tener que volver a publicar la aplicación de funciones, vea Actualización de las extensiones. |
Conceptos clave
(1)-(2) Enlace de entrada WebPubSubConnection
con HttpTrigger para generar la conexión de cliente.
(3)-(4) Enlace de desencadenador WebPubSubTrigger
o enlace de entrada WebPubSubContext
con HttpTrigger para controlar la solicitud de servicio.
(5)-(6) Enlace de salida WebPubSub
para solicitar que el servicio realice alguna acción.
Enlace del desencadenador
Use el desencadenador de función para controlar las solicitudes del servicio Azure Web PubSub.
WebPubSubTrigger
se usa cuando necesita controlar las solicitudes del lado del servicio. El patrón de punto de conexión del desencadenador sería similar al siguiente, que debe establecerse en el lado del servicio Web PubSub (portal: configuración -> controlador de eventos -> plantilla de URL). En el patrón de punto de conexión, el elemento de consulta code=<API_KEY>
es OBLIGATORIO cuando se usa la aplicación de funciones de Azure por motivos de seguridad. La clave se puede encontrar en Azure Portal. Busque el recurso de la aplicación de funciones y vaya Functions ->Claves de la aplicación ->Claves del sistema ->webpubsub_extension después de implementar la aplicación de funciones en Azure. Sin embargo, esta clave no es necesaria para trabajar con funciones locales.
<Function_App_Url>/runtime/webhooks/webpubsub?code=<API_KEY>
Ejemplo
[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}");
}
El enlace WebPubSubTrigger
también admite el valor devuelto en escenarios de sincronización, como, por ejemplo, Connect
del sistema y los eventos de usuario, cuando el servidor puede comprobar y denegar la solicitud de cliente o enviar mensajes directamente al autor de la llamada. El evento Connect
respeta ConnectEventResponse
y EventErrorResponse
, y el evento de usuario respeta UserEventResponse
y EventErrorResponse
; los tipos rest que no coincidan con el escenario actual se ignoran. Y si se devuelve EventErrorResponse
, el servicio quitará la conexión de cliente.
[FunctionName("WebPubSubTriggerReturnValueFunction")]
public static UserEventResponse Run(
[WebPubSubTrigger("hub", WebPubSubEventType.User, "message")] UserEventRequest request)
{
return request.CreateResponse(BinaryData.FromString("ack"), WebPubSubDataType.Text);
}
Atributos y anotaciones
En las bibliotecas de clases C#, use el atributo WebPubSubTrigger
.
A continuación, se muestra un atributo WebPubSubTrigger
en una signatura de método:
[FunctionName("WebPubSubTrigger")]
public static void Run([WebPubSubTrigger("<hub>", <WebPubSubEventType>, "<event-name>")]
WebPubSubConnectionContext context, ILogger log)
{
...
}
Para ver un ejemplo completo, consulte el ejemplo de C#.
Configuración
En la siguiente tabla se explican las propiedades de configuración de enlace que se establecen en el archivo function.json.
Propiedad de function.json | Propiedad de atributo | Descripción |
---|---|---|
type | N/D | Requerida: se debe establecer en webPubSubTrigger . |
direction | N/D | Requerida: se debe establecer en in . |
name | N/D | Requerido: el nombre de la variable que se utiliza en el código de función para el parámetro que recibe los datos del evento. |
hub | Hub | Requerido: el valor debe establecerse en el nombre del centro de Web PubSub para la función que se va a desencadenar. Se permite establecer el valor en el atributo como prioridad más alta o se puede establecer en la configuración de la aplicación como un valor global. |
eventType | WebPubSubEventType | Requerido: el valor debe establecerse en el tipo de evento de los mensajes para la función que se va a desencadenar. El valor debe ser user o system . |
eventName | EventName | Requerido: el valor debe establecerse en el evento de los mensajes para la función que se va a desencadenar. Para el tipo de evento system , el nombre del evento debería estar en connect , connected , disconnected . Para los subprotocolos definidos por el usuario, el nombre del evento es message . En el caso del subprotocolo compatible con el sistema json.webpubsub.azure.v1. , el nombre del evento es el nombre del evento definido por el usuario. |
connection | Connection | Opcional: el nombre de una configuración de aplicación o una colección de configuraciones que especifica el servicio Azure Web PubSub ascendente. El valor se usa para la validación de firmas. Y el valor se resuelve automáticamente con la configuración de la aplicación "WebPubSubConnectionString" por defecto. Y null significa que la validación no es necesaria y siempre se realizará correctamente. |
Usos
En C#, WebPubSubEventRequest
es el parámetro de enlace reconocido de tipo, los parámetros rest están enlazados por el nombre del parámetro. Consulte a continuación la tabla de los parámetros y tipos disponibles.
En un lenguaje débilmente tipado como JavaScript, name
en function.json
se usará en para enlazar el objeto desencadenador con respecto a la tabla de asignación siguiente. Asimismo, respetará dataType
en function.json
para convertir el mensaje en consecuencia cuando name
esté establecido en data
como el objeto de enlace para la entrada del desencadenador. Todos los parámetros se pueden leer desde context.bindingData.<BindingName>
y se convertirán a JObject
.
Nombre del enlace | Tipo de enlace | Descripción | Propiedades |
---|---|---|---|
solicitud | WebPubSubEventRequest |
Describe la solicitud ascendente | La propiedad difiere según distintos tipos de eventos, incluidas las clases derivadas ConnectEventRequest , ConnectedEventRequest , UserEventRequest y DisconnectedEventRequest . |
connectionContext | WebPubSubConnectionContext |
Información de solicitud común | EventType, EventName, Hub, ConnectionId, UserId, Headers, Origin, Signature, States |
data | BinaryData ,string ,Stream ,byte[] |
Solicitud de datos de mensaje del cliente en el evento message de usuario |
- |
dataType | WebPubSubDataType |
Solicitud de mensaje de dataType, que admite binary , text , json |
- |
claims | IDictionary<string, string[]> |
Notificaciones del usuario en la solicitud connect del sistema |
- |
consulta | IDictionary<string, string[]> |
Consulta del usuario en la solicitud connect del sistema |
- |
subprotocols | IList<string> |
Subprotocolos disponibles en la solicitud connect del sistema |
- |
clientCertificates | IList<ClientCertificate> |
Lista de huellas digitales de certificado de clientes en la solicitud connect del sistema |
- |
reason | string |
Motivo de la solicitud disconnected del sistema |
- |
Importante
En C#, varios tipos admitidos parámetro DEBEN colocarse en el primero, es decir request
, o data
que no sea el tipo predeterminado BinaryData
para que el enlace de función sea correcto.
Return response
WebPubSubTrigger
respeta la respuesta devuelta por el cliente para los eventos síncronos de connect
y el evento del usuario. Solo se devuelve la respuesta coincidente al servicio; de lo contrario, se omite. Además, el objeto devuelto WebPubSubTrigger
admite a los usuarios que realicen SetState()
y ClearStates()
para administrar los metadatos de la conexión. Y la extensión combinará los resultados del valor devuelto con los originales de la solicitud WebPubSubConnectionContext.States
. El valor de la clave existente se sobrescribe y se agrega el valor de la nueva clave.
Tipo devuelto | Descripción | Propiedades |
---|---|---|
ConnectEventResponse |
Respuesta para el evento connect |
Groups, Roles, UserId, Subprotocol |
UserEventResponse |
Respuesta para el evento de usuario | DataType, Data |
EventErrorResponse |
Respuesta de error para el evento de sincronización | Code, ErrorMessage |
*WebPubSubEventResponse |
Tipo de respuesta base de los admitidos que se usan para casos de devolución inciertos. | - |
Enlace de entrada
Nuestra extensión proporciona dos enlaces de entrada destinados a necesidades diferentes.
WebPubSubConnection
Para que un cliente pueda conectarse al servicio Azure Web PubSub, debe conocer la dirección URL del punto de conexión del servicio y tener un token de acceso válido. El enlace de entrada
WebPubSubConnection
genera la información necesaria, por lo que el cliente no necesita controlar la generación de tokens. Dado que el token tiene una limitación temporal y se puede usar para autenticar un usuario concreto en una conexión, no lo almacene en la caché ni lo comparta con clientes. Se puede usar un desencadenador HTTP que funcione con este enlace de entrada para que los clientes recuperen la información de conexión.WebPubSubContext
Cuando se usa Static Web Apps,
HttpTrigger
es el único desencadenador admitido y, en el escenario de Web PubSub, proporcionamos el enlace de entradaWebPubSubContext
, que ayuda a los usuarios a deserializar la solicitud HTTP ascendente desde el lado del servicio en protocolos de Web PubSub. Por lo tanto, los clientes pueden obtener resultados similares en comparación conWebPubSubTrigger
para controlar fácilmente las funciones. Vea ejemplos a continuación. Cuando se usa conHttpTrigger
, el cliente debe configurar la dirección URL expuesta de HttpTrigger en el controlador de eventos según corresponda.
Ejemplo: WebPubSubConnection
En el siguiente ejemplo se muestra una función de C# que adquiere la información de la conexión de Web PubSub mediante el enlace de entrada y la devuelve a través de HTTP. En el ejemplo siguiente, se pasa UserId
a través del elemento de consulta de la solicitud de cliente como ?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;
}
Tokens autenticados
Si la función la desencadena un cliente autenticado, puede agregar una notificación del identificador de usuario al token generado. Puede agregar fácilmente la autenticación a una aplicación de función mediante Autenticación de App Service.
Autenticación de App Service establece encabezados HTTP denominados x-ms-client-principal-id
y x-ms-client-principal-name
que contienen el identificador y el nombre de la entidad de seguridad de cliente del usuario autenticado, respectivamente.
Puede establecer la propiedad UserId del enlace en el valor de cualquier encabezado mediante una expresión de enlace: {headers.x-ms-client-principal-id}
o {headers.x-ms-client-principal-name}
.
[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;
}
Nota:
Limitado a los tipos de parámetros de enlace no admiten una manera de pasar lista ni matriz, no WebPubSubConnection
se admite completamente con todos los parámetros que tiene el SDK del servidor de parámetros, especialmente roles
, y también incluye groups
y expiresAfter
. En caso de que el cliente necesite agregar roles o retrasar la compilación del token de acceso en la función, se recomienda trabajar con el SDK de servidor para C#.
[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);
}
Ejemplo: WebPubSubContext
En el siguiente ejemplo se muestra una función de C# que adquiere la información de la solicitud de nivel superior de Web PubSub mediante el enlace de entrada en el tipo de evento connect
y la devuelve a través de 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;
}
Configuración
WebPubSubConnection
En la siguiente tabla se explican las propiedades de configuración del enlace que se establecen en el archivo function.json y el atributo WebPubSubConnection
.
Propiedad de function.json | Propiedad de atributo | Descripción |
---|---|---|
type | N/D | Se debe establecer en webPubSubConnection |
direction | N/D | Se debe establecer en in |
name | N/D | Nombre de variable utilizado en el código de función para el objeto de enlace de la conexión de entrada. |
hub | Hub | Requerido: el valor debe establecerse en el nombre del centro de Web PubSub para la función que se va a desencadenar. Se permite establecer el valor en el atributo como prioridad más alta o se puede establecer en la configuración de la aplicación como un valor global. |
userId | UserId | Opcional: valor de la notificación del identificador de usuario que se debe establecer en el token de la clave de acceso. |
connection | Connection | Obligatorio: el nombre de la configuración de la aplicación que contiene la cadena de conexión del servicio Web PubSub (el valor predeterminado es "AzureSignalRConnectionString"). |
WebPubSubContext
En la siguiente tabla se explican las propiedades de configuración de enlace que se definen en el archivo functions.json y el atributo WebPubSubContext
.
Propiedad de function.json | Propiedad de atributo | Descripción |
---|---|---|
type | N/D | Se debe establecer en webPubSubContext . |
direction | N/D | Se debe establecer en in . |
name | N/D | Nombre de variable usado en el código de función para la solicitud de Web PubSub de entrada. |
connection | Connection | Opcional: el nombre de una configuración de aplicación o una colección de configuraciones que especifica el servicio Azure Web PubSub ascendente. El valor se usará para la protección contra abusos y la validación de firmas. Y el valor se resolverá automáticamente con "WebPubSubConnectionString" de forma predeterminada. Y null significa que la validación no es necesaria y siempre se realizará correctamente. |
Uso
WebPubSubConnection
WebPubSubConnection
proporciona las propiedades siguientes.
Nombre del enlace | Tipo de enlace | Descripción |
---|---|---|
BaseUri | Identificador URI | Identificador URI de conexión de cliente de Web PubSub. |
Identificador URI | Identificador URI | Identificador URI absoluto de la conexión de Web PubSub; contiene la base generada por AccessToken en la solicitud. |
AccessToken | string | AccessToken generado basado en la información de servicio y UserId de la solicitud. |
WebPubSubContext
WebPubSubContext
proporciona las propiedades siguientes.
Nombre del enlace | Tipo de enlace | Descripción | Propiedades |
---|---|---|---|
solicitud | WebPubSubEventRequest |
Solicitud del cliente; consulte la tabla siguiente para obtener más información. | WebPubSubConnectionContext desde el encabezado de solicitud y otras propiedades deserializadas del cuerpo de la solicitud describen a esta, por ejemplo, Reason para DisconnectedEventRequest . |
response | HttpResponseMessage |
La extensión genera la respuesta principalmente para AbuseProtection y los casos de error. |
- |
errorMessage | string | Describa los detalles del error al procesar la solicitud ascendente. | - |
hasError | bool | Marca para indicar si se trata de una solicitud ascendente de Web PubSub válida. | - |
isPreflight | bool | Marca para indicar si se trata de una solicitud preparatoria de AbuseProtection . |
- |
Para WebPubSubEventRequest
, se deserializa en diferentes clases que proporcionan información diferente sobre el escenario de solicitud. Para PreflightRequest
o para casos no válidos, el usuario puede comprobar las marcas IsPreflight
y HasError
y averiguarlo. Se recomienda devolver la respuesta WebPubSubContext.Response
de compilación del sistema directamente, o bien el cliente puede registrar los errores a petición. En escenarios diferentes, el cliente puede leer las propiedades de la solicitud como se indica a continuación.
Clase derivada | Descripción | Propiedades |
---|---|---|
PreflightRequest |
Se usa en AbuseProtection cuando IsPreflight es true. |
- |
ConnectEventRequest |
Se usa en el tipo de evento Connect del sistema. |
Claims, Query, Subprotocols, ClientCertificates |
ConnectedEventRequest |
Se usa en el tipo de evento Connected del sistema. |
- |
UserEventRequest |
Se usa en el tipo de evento de usuario. | Data, DataType |
DisconnectedEventRequest |
Se usa en el tipo de evento Disconnected del sistema. |
Motivo |
Nota:
Aunque WebPubSubContext
es un enlace de entrada que proporciona una manera similar de deserialización de solicitudes en HttpTrigger
en comparación con WebPubSubTrigger
, hay limitaciones como, por ejemplo, que no se admite un estado de conexión posterior a la combinación. El lado del servicio seguirá respetando la respuesta de devolución, pero los usuarios deberán crear la respuesta ellos mismos. Si los usuarios tienen que establecer la respuesta del evento, debe devolver una respuesta HttpResponseMessage
que contenga ConnectEventResponse
o mensajes del evento del usuario como cuerpo de la respuesta y poner el estado de conexión con la clave ce-connectionstate
en el encabezado de respuesta.
Enlace de salida
Use el enlace de salida de Web PubSub para invocar al servicio Azure Web PubSub para hacer algo. Puede difundir un mensaje a:
- Todos los clientes conectados
- Clientes conectados autenticados para un usuario específico
- Clientes conectados unidos a un grupo específico
- Una conexión de cliente específica
El enlace de salida también le permite administrar clientes y grupos, y conceder o revocar permisos destinados al identificador de conexión con el grupo específico.
- Agregar conexión al grupo
- Agregar usuario a un grupo
- Eliminación de una conexión de un grupo
- Eliminación de un usuario de un grupo
- Eliminación de un usuario de todos los grupos
- Cierre de todas las conexiones de cliente
- Cierre de una conexión de cliente específica
- Cierre de conexiones de un grupo
- Concesión del permiso de una conexión
- Revocación del permiso de una conexión
Para obtener información sobre los detalles de instalación y configuración, vea la información general.
Ejemplo
[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
es el tipo abstracto base de los enlaces de salida. Los tipos derivados representan el servidor de acción que quiere que se invoque el servicio.
En el lenguaje C#, se proporcionan algunos métodos estáticos en WebPubSubAction
para ayudar a detectar las acciones disponibles. Por ejemplo, el usuario puede crear SendToAllAction
mediante una llamada a WebPubSubAction.CreateSendToAllAction()
.
Clase derivada | Propiedades |
---|---|
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 |
Configuración
WebPubSub
En la tabla siguiente se explican las propiedades de configuración del enlace que se establecen en el archivo function.json y el atributo WebPubSub
.
Propiedad de function.json | Propiedad de atributo | Descripción |
---|---|---|
type | N/D | Se debe establecer en webPubSub |
direction | N/D | Se debe establecer en out |
name | N/D | Nombre de variable utilizado en el código de función para el objeto de enlace de la tabla. |
hub | Hub | El valor debe establecerse en el nombre del centro de Web PubSub para la función que se va a desencadenar. Se permite establecer el valor en el atributo como prioridad más alta o se puede establecer en la configuración de la aplicación como un valor global. |
connection | Connection | Nombre de la configuración de la aplicación que contiene la cadena de conexión del servicio Web PubSub (el valor predeterminado es "AzureSignalRConnectionString"). |
Solución de problemas
Configuración del registro de la consola
También puede habilitar el registro de la consola fácilmente si desea profundizar más en las solicitudes que realiza en el servicio.
Pasos siguientes
Use estos recursos para empezar a compilar su propia aplicación: