public void MapPinningRule(WebMap webMap, string registeredSectionUri = null)
        {
            var sectionUri = registeredSectionUri ?? webMap.Section.GetMappingUrl();

            if (registeredSectionUri == null)
            {
                RegisterEmptyHandler(sectionUri);
            }

            string token  = webMap.GetMappingToken();
            string mapUri = webMap.GetMappingUrl();

            // map URI for empty Catch URI on the blending token
            if (webMap.Url != null && !Blender.IsMapped(sectionUri, token))
            {
                Blender.MapUri(sectionUri, token);
            }

            // map URI for WebMap's Catch URI on the same blending token;
            // this will be calling by WebsiteProvider
            if (!Blender.IsMapped(mapUri, token))
            {
                RegisterEmptyHandler(mapUri);
                Blender.MapUri(mapUri, token);
            }

            // map URI for WebMap's Pin URI on the same token
            Blender.MapUri(webMap.ForeignUrl, token);
        }
        public void UnmapPinningRule(WebMap webMap)
        {
            if (webMap.Section?.Template == null)
            {
                // if the Blending Point (WebSection) or the Surface (WebTemplate) was deleted earlier
                return;
            }
            string token  = webMap.GetMappingToken();
            string mapUri = webMap.GetMappingUrl();

            Blender.UnmapUri(webMap.ForeignUrl, token);

            if (webMap.Url != null)
            {
                var uriByTokenCount = Blender.ListAll().Where(x => x.Key == token).SelectMany(x => x.Value).Count();
                if (uriByTokenCount == 2) // one URI for empty WebMap's handler and another one for empty WebSection's handler
                {
                    Blender.UnmapUri(mapUri, token);
                    Handle.UnregisterHttpHandler("GET", mapUri);
                }
            }
        }