Webhook – A simple HTTP POST based pub/sub mechanism between web applications or services. This is a very effective that most of the modern web applications use this in order to handle event based pub/sub.
ASP.NET WebHooks is a framework which is in the preview release; this eases the task of incorporating webhooks in ASP.NET applications. It provides some predefined clients to subscribe events from, like Instagram, GitHub and others. It also provides a way to setup our custom ASP.NET web applications to send webhook notifications to the subscribed clients and prepare the clients to receive the webhook notifications. See the below URL for the more information.
How WebHooks work and the structure of the ASP.NET WebHook Framework
Webhooks are simple HTTP POST based pub/sub.
Webhooks has the following structure.
- The web application/service which publishes the events should provide an interface for the subscribers to register for the webhooks.
- Subscribers select the events they want to subscribe to, submit the callback URL to be notified along with other optional parameters. Security keys are most common among the other optional parameters.
- The publisher will persist the subscriber details.
- When the event occurs publisher notifies all the eligible subscribers by triggering POST request to the callback back along with the event data.
The above 4 steps are the most vital steps of a working webhook. Let’s see how ASP.NET Webhooks implement this.
As of this writing ASP.NET Webhooks are in preview and nugget packages also in the preview release.
The support for sending WebHooks is provided by the following Nuget packages:
- Microsoft.AspNet.WebHooks.Custom: This package provides the core functionality for adding WebHook support to your ASP.NET project. The functionality enables users to register WebHooks using a simple pub/sub model and for your code to send WebHooks to receivers with matching WebHook registrations.
- Microsoft.AspNet.WebHooks.Custom.AzureStorage This package provides optional support for persisting WebHook registrations in Microsoft Azure Table Storage.
- Microsoft.AspNet.WebHooks.Custom.Mvc This package exposes optional helpers for accessing WebHooks functionality from within ASP.NET MVC Controllers. The helpers assist in providing WebHook registration through MVC controllers as well as creating event notification to be sent to WebHook registrants.
- Microsoft.AspNet.WebHooks.Custom.Api This package contains an optional set of ASP.NET Web API Controllers for managing filters and registrations through a REST-style interface.
ASP.NET Webhooks works well in Web API and it has the Azure Table Storage provider for persisting the publisher metadata and event data.
What is missing
According to the article, webhooks are delivered to the users based on authorization. So ASP.NET webhooks store the information of the subscriber along with the user information. This helps the ASP.NET webhooks to publish the event to the right subscriber.
For example, 2 users have subscribed to the same event.
|User Id||Event||Callback URL|
ASP.NET Webhooks requires the subscribers to login to the application or the REST service in order to subscribe the events.
So when the event is triggered based on the logged in user the POST request is made to the right client. ASP.NET webhooks use user based notifications. Is there any limitation in this?
Yes, consider a scenario – where you have an application with multiple customers. Each customer has many users. And the admin of one customer wants subscribe to the PhotoAdded event as above. Her intention is to be notified whenever any of her users add a photo. So if she registers for a webhook by logging in using her credentials, she will get the notifications only when she adds a photo, because ASP.NET webhooks by default provide user based notifications. Also we can’t register this event in the global level with no authentication, the she will be notified when users of the other customers add a photo.
I hope ASP.NET webhook will provide a way to customize the notification. As of now NotifyAsync is a static extension method to which the overriding is not possible.