Este proyecto proporciona un conjunto de herramientas .NET para la gestión de suscripciones a eventos, transformaciones básicas y notificaciones de tales ocurrencias de eventos ( webhooks ): en un alcance de diseño global, este modelo permite arquitecturas basadas en eventos, lo que desencadena procesos del sistema en la aparición de ocurrencias esperadas de otros sistemas.
Aunque este modelo de integración es ampliamente adoptado por los principales proveedores de servicios (como SendGrid , Twilio , GitHub , Slack , etc.), no existe un protocolo o autoridad formal que imponga un cumplimiento (como otros casos, como OpenID, OpenApi, etc.).
De todos modos, una implementación típica consiste en los siguientes elementos:
Traté de expresar los conceptos con más detalle en esta página dentro de este repositorio (sin ninguna ambición de ser pedagógico).
Las bibliotecas proporcionadas actualmente por el marco son las siguientes:
| Biblioteca | Nuget | GitHub (Prerelease) |
|---|---|---|
| Deveel.webhooks | ||
| Deveel.webhooks.sender | ||
| Deveel.webhooks.Service | ||
| Deveel.webhooks.mongodb | ||
| Deveel.webhooks.EntityFramework | ||
| Deveel.webhooks.dynamiclinq | ||
| Deveel.webhooks.receiver.aspnetcore |
Las siguientes bibliotecas extienden el marco con los receptores para proveedores específicos:
| Biblioteca | Nuget | GitHub (Prerelease) |
|---|---|---|
| Deveel.webhooks.receiver.twilio | ||
| Deveel.webhooks.receiver.sendgrid | ||
| Deveel.webhooks.receiver.facebook |
Puede obtener las versiones estables de estas bibliotecas del canal oficial de Nuget.
Para obtener las últimas versiones previas a la liberación de los paquetes, puede restaurar desde el administrador de paquetes Deveel.
Nos gustaría ayudarlo a comenzar con este marco y eventualmente extenderlo: consulte la sección de documentación o al sitio web oficial que hemos producido para usted.
La forma más fácil de comenzar es seguir la guía de inicio , pero también puede consultar la sección de preguntas frecuentes para obtener respuestas a las preguntas más comunes.
Mientras trabajaba en un proyecto PAAS ( Plataforma como servicio) .NET Core 3.1/.NET 5 (plataforma como servicio ) que requería funcionalmente la capacidad de los usuarios del servicio que pueden crear suscripciones de sistema a sistemas y notificaciones de eventos a través del canal HTTP (que típicamente se nombra webhooks o http de callbal Tal ambición:
La documentación del marco le proporcionará más detalles sobre los requisitos, configuraciones, uso y extensibilidad del marco.
De todos modos, para ayudarlo a comenzar con el marco, considere los siguientes ejemplos que muestran cómo crear un servicio simple de administración de webhook, que manejen suscripciones y notificaciones, y un receptor cliente.
Como proveedor de servicio, esta biblioteca proporciona funciones para manejar los dos aspectos principales del patrón Webhook:
El siguiente ejemplo muestra cómo crear una suscripción de Webhook y cómo enviar una notificación a los puntos finales del suscriptor:
using Microsoft . AspNetCore . Builder ;
using Deveel . Webhooks ;
namespace Example {
public class Program {
public static void Main ( string [ ] args ) {
var builder = WebApplication . CreateBuilder ( args ) ;
// ...
builder . Services . AddWebhookSubscriptions < MongoWebhookSubscription > ( subs => {
subs . UseMongoDb ( "mongodb://localhost:27017" )
. UseSubscriptionResolver ( ) ;
} ) ;
builder . Services . AddWebhookNotifier < MyWebhook > ( notifier => {
notifier . UseSender ( sender => {
sender . Configure ( options => {
options . Timeout = TimeSpan . FromSeconds ( 30 ) ;
} ) ;
} ) ;
} ) ;
var app = builder . Build ( ) ;
// ...
// ... and notify the receivers manually ...
app . MapPost ( "/webhooks" , async ( HttpContext context ,
[ FromServices ] IWebhookSender < MyWebhook > sender , [ FromBody ] MyWebhookModel webhook ) => {
var destination = webhook . Destination . ToWebhookDestination ( ) ;
var result = await sender . SendAsync ( destination , webhook , context . HttpContext . RequestAborted ) ;
// ...
return Results . Ok ( ) ;
} ) ;
// ... or notify the webhooks automatically from subscriptions
app . MapPost ( "/webhooks/notify" , async ( HttpContext context ,
[ FromServices ] IWebhookNotifier < MyWebhook > notifier , [ FromBody ] MyEventModel eventModel ) => {
var eventInfo = eventModel . AsEventInfo ( ) ;
var result = await notifier . NotifyAsync ( eventInfo , context . HttpContext . RequestAborted ) ;
// you can log the result of the notification to all receivers ...
return Results . Ok ( ) ;
} ) ;
app . Run ( ) ;
}
}
} El marco también proporciona un conjunto de receptores incorporados que se pueden usar para manejar las notificaciones entrantes desde los puntos finales suscritos en su aplicación.
El siguiente ejemplo muestra cómo crear un receptor para un webhook respaldado por un mensaje de Messenger de Facebook:
namespace Example {
public class Program {
public static void Main ( string [ ] args ) {
var builder = WebApplication . CreateBuilder ( args ) ;
// ...
builder . Services . AddFacebookReceiver ( )
. AddHandler < MyFacebookWebhookHandler > ( ) ;
var app = builder . Build ( ) ;
// ...
// ... you can handle all the incoming webhooks at "/webhooks/facebook"
// invoking all the handlers registered in the service collection ...
app . MapFacebookWebhook ( "/webhooks/facebook" ) ;
// ... or you can handle the incoming webhooks manually ...
app . MapFacebookWebhook ( "/webhooks/facebook2" , async ( FacebookWebhook webhook , IService service , CancellationToken ct ) => {
// ...
await service . DoSomethingAsync ( webhook , ct ) ;
} ) ;
app . Run ( ) ;
}
}
} Las contribuciones a proyectos de código abierto, como Deveel Webhooks , generalmente están impulsadas por el interés en usar el producto y los servicios, si respetan algunas de las expectativas que tenemos para sus funciones.
Las mejores formas de contribuir y mejorar la calidad de este proyecto son probándolo, presentando problemas, uniéndose a conversaciones de diseño y haciendo solicitudes de extracción.
Consulte las pautas de contribución para recibir más detalles sobre cómo puede contribuir a este proyecto.
Nuestro objetivo es abordar la mayoría de las preguntas que pueda tener proporcionando documentos, respondiendo preguntas frecuentes y haciendo un seguimiento de temas como informes de errores y solicitudes de funciones.
Este proyecto se publica bajo el acuerdo de licencia de código abierto Apache 2.