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.

Acción 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

Diagram showing the workflow of Azure Web PubSub service working with Function Apps.

(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>

Screenshot of get function system keys.

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, Connectdel 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. Connectel evento respeta y EventErrorResponse, y el evento de usuario respeta ConnectEventResponseUserEventResponse y EventErrorResponse, se omiten los tipos rest que no coinciden con el escenario actual. Y si EventErrorResponse se devuelve, el servicio quita 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 "WebPubSub Conectar ionString" de forma predeterminada. Y null significa que la validación no es necesaria y siempre se realiza 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 lenguaje débilmente tipado como JavaScript, name en function.json se usa para enlazar el objeto desencadenador con respecto a la tabla de asignación siguiente. Además, respete dataType la conversión del mensaje en consecuencia cuando name se establece data en function.json como el objeto de enlace para la entrada del desencadenador. Todos los parámetros se pueden leer desde context.bindingData.<BindingName> y se JObject convierten.

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
datos BinaryData,string,,Stream,byte[] Solicitud de datos de mensaje del cliente en el evento message de usuario -
dataType WebPubSubDataType Request message 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 eventos sincrónicos de eventos de connect usuario y . 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 combina 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 entrada WebPubSubContext, 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 con WebPubSubTrigger para controlar fácilmente las funciones. Vea ejemplos a continuación. Cuando se usa con HttpTrigger, 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 tabla siguiente se explican las propiedades de configuración de enlace establecidas en el archivo function.json y el WebPubSubConnection atributo .

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 usa para la protección contra abusos y la validación de firmas. El valor se resuelve automáticamente con "WebPubSub Conectar ionString" de forma predeterminada. Y null significa que la validación no es necesaria y siempre se realiza correctamente.

Uso

WebPubSubConnection

WebPubSubConnection proporciona las propiedades siguientes.

Nombre del enlace Tipo de enlace Descripción
BaseUri Uri Identificador URI de conexión de cliente de Web PubSub.
Uri 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. La respuesta de devolución sigue siendo respetada por el lado del servicio, pero los usuarios necesitan crear la propia respuesta. 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 de enlace establecidas en el archivo function.json y el WebPubSub atributo .

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: