K Khan
Nov 12, 2015
  8240
(2 votes)

WebHooks Sender and Receiver

Microsoft ASP.NET WebHooks makes it easier to both send and receive WebHooks as part of your an ASP.Net application so for an EPiServer application also. I have been given a chance for a technical talk with fellow EMVP Mark Everard at EPiServer UK Ascend. I have presented a demo Server that was responsible to subscribe alloy site and publish an event. On other hand Alloy site was accepting those changes via Microsoft ASP.Net WebHooks.

On the receiving side, ASP.NET WebHooks provides a common model for receiving and processing WebHooks from any number of WebHook providers. In my case Alloy site will be a receiving side processing a change of display name received from a Demo server.

On the sending side, ASP.NET WebHooks provides support for managing and storing subscriptions as well as for sending event notifications to the right set of subscribers. In my case Demo server will send notification to (subscriber ) alloy site for defined set of event 'entryupdating'.

A console demo server application can be downloaded, that will subscribe alloy site and will publish an event that a display name has been changed for a product.

To set-up a receiver, you will require some exercise.

Download and set-up Alloy site.

Install a custom webhook receiver Nuget Package 

Initialize the Custom WebHook Receiver

public static void Register(HttpConfiguration config)
        {
            // Web API routes
          
            // Initialize Custom WebHooks Register
            config.InitializeReceiveCustomWebHooks();
        }

Add following application settings in Web.config

<appSettings>
  <add key="MS_WebHookReceiverSecret_Custom" value="12345678901234567890123456789012" />
</appSettings>

Add a handler, that will receive changes

public class Handler : WebHookHandler
    {
        public Handler()
        {
            this.Receiver = "custom";
        }

        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            JObject entry = context.GetDataOrDefault<JObject>();
            CustomNotification notification = entry["Notifications"][0].ToObject<CustomNotification>();
            if (notification.Action == "entryupdating")
            {
                UrlResolver resolver = ServiceLocator.Current.GetInstance<UrlResolver>();
                var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
                var product = resolver.Route(new EPiServer.UrlBuilder(string.Format("http://localhost:51481/en/{0}/", notification.ProductId)));
                var page = contentRepository.Get<ProductPage>(product.ContentLink).CreateWritableClone();

                if (page != null)
                {
                    page.Name = notification.ProductName;
                }
                contentRepository.Save(page, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.NoAccess);
            }
            return Task.FromResult(true);   
        }
    }

In case if you will be wondering what is CustomNotification

public class CustomNotification
    {
        [JsonProperty("Action")]
        public string Action { get; set; }

        [JsonProperty("id")]
        public string ProductId { get; set; }
        
        [JsonProperty("name")]
        public string ProductName { get; set; }
    }

How To Run:

Run Alloy Site (in debug mode to see what WebHookHandlerContext contains)

 Image alloy0.JPG

Run Console application (It will subscribe alloy in memory of console application and will publish change of display name)

Refresh your browser
Image alloy.JPG

(Don't ask! can we not do this using CMS Online center :) )

You will have to bear with me for few more blogs on this topic.

Happy Hooks!

Nov 12, 2015

Comments

Per Magne Skuseth
Per Magne Skuseth Nov 13, 2015 10:40 AM

Cool!

K Khan
K Khan Nov 13, 2015 11:48 AM

Its a food of thought for system architecths. They can think outside of the boundries with this option. It can help a lot in Commerce Projects where multiple systems and technologies are working togather. e.g. in Pricing or inventory updates, Order fulfilments etc.

Please login to comment.
Latest blogs
Improve error handling for visitor groups

In CMS UI 12.15.0 we added several improvements in handling errors for visitor groups. The visitor group list and detailed visitor group page will...

Linh Nguyen | Dec 8, 2022

Optimizely SendGrid SMTP host is deprecated

SendGrid is a services for sending email that is included in Optimizely DXP. Previously smtp.episerver.net was the recommended SMTP server to use,...

Tomas Hensrud Gulla | Dec 4, 2022 | Syndicated blog

Hosting Optimizely CMS 12 on Docker Engine

Since Optimizely CMS can now be deployed as a Docker container, here is a demonstration of building, running and scaling an Optimizely CMS 12 site ...

Stefan Holm Olsen | Dec 4, 2022 | Syndicated blog

How to use CacheTagHelper with content areas in Optimizely CMS 12

I might be going out on a limb here - if you have a better solution, feel very free to share it!  Upgrading your Optimizely web application from .N...

Andreas J | Dec 2, 2022

The 1001st Piece in your 1000 Piece Puzzle: .NET Default Interface Functions

I was recently working with a client who wanted a reasonably large subsystem added to Optimizely that would add automated management to their...

Greg J | Nov 28, 2022 | Syndicated blog

Video Demonstration, creating a CMS12 Alloy Sample Site

Hey All Below you will find a quick video demonstration on how to install a local version of Alloy Sample based on CMS12 / .Net 6. As you will see ...

Minesh Shah (Netcel) | Nov 28, 2022