{"id":2360,"date":"2016-07-05T10:00:25","date_gmt":"2016-07-05T08:00:25","guid":{"rendered":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?p=2360"},"modified":"2016-07-07T12:10:11","modified_gmt":"2016-07-07T10:10:11","slug":"webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/","title":{"rendered":"Introducci\u00f3n a WebHooks"},"content":{"rendered":"<h4><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2356 size-full\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png\" alt=\"webhooks\" width=\"472\" height=\"225\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png 472w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks-300x143.png 300w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/>Los tiempos en el desarrollo van cambiando y junto a ello naturalmente las herramientas de desarrollo, los patrones y la forma en la que se hacen las cosas.<\/h4>\n<p>Un claro ejemplo son los Event Receiver y los WebHook. Hasta hace unos a\u00f1os nuestro pensamiento era que nuestra aplicaci\u00f3n ten\u00eda que estar esperando determinados cambios para realizar determinadas acciones. En caso de que esto fuera una aplicaci\u00f3n de terceros, tendr\u00edamos bien que implementar un proceso o \u00abdemonio\u00bb que estuviera permanentemente comprobando si se cumple una determinada condici\u00f3n para hacer determinada acci\u00f3n.<!--more--><\/p>\n<p>Ahora bien, esto est\u00e1 claro que en un modelo de desarrollo basado en el cloud d\u00f3nde tenemos que simplificar el tiempo de proceso (y por lo tantos los costes). A ra\u00edz de esto surge el concepto de <strong>WebHook<\/strong>. Podemos definirlo como:<\/p>\n<p><em>Realizar llamadas \u00abCallBacks\u00bb que hacen las aplicaciones Web, pudiendo ser esta llamada por nuestra aplicaci\u00f3n o bien por terceras aplicaciones que nada tiene que ver la aplicaci\u00f3n original. <\/em><\/p>\n<p>Aplicaciones como GitHub, Slack, WordPress, etc. las pusieron de moda. \u00a0Nosotros en <a href=\"http:\/\/www.encamina.com\/\" target=\"_blank\">ENCAMINA<\/a>,\u00a0en nuestro Slack, tenemos <strong>varios WebHooks contra Visual Studio Team Services<\/strong> porque nos interesa saber cu\u00e1l es el resultado de la Build o cu\u00e1ndo finalizamos tareas.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2361\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Slack.png\" alt=\"Slack\" width=\"910\" height=\"218\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Slack.png 910w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Slack-300x72.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Slack-768x184.png 768w\" sizes=\"auto, (max-width: 910px) 100vw, 910px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Dado que cambi\u00f3 la pauta del funcionamiento, cuando hay un evento que nuestra aplicaci\u00f3n necesita saber, la aplicaci\u00f3n origen notifica a dicha aplicaci\u00f3n. En este post, vamos a ver una<strong> introducci\u00f3n de c\u00f3mo montar un WebHook en ASP.NET<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/www.hanselman.com\/blog\/content\/binary\/Windows-Live-Writer\/fa342a3c97d5_D620\/WebHookReceivers_3132734c-c730-475e-a3c9-1239b97b542d.png\" width=\"450\" height=\"212\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>Cuando trabajamos con los WebHooks tenemos dos opciones que implementar:<\/h3>\n<ul>\n<li><strong>Sending.<\/strong>\u00a0Es \u00a0la parte encargada de enviar los postback a los subscriptores cuando se produce la acci\u00f3n a la que se han subscrito. Por ejemplo: Visual Studio Team Services se encarga de notificar a sus subscriptores que una compilaci\u00f3n a terminado.<\/li>\n<li><strong>Receivers.<\/strong> Esta parte es un handler\/servicio web que est\u00e1 permanentemente a la escucha para poder obtener la notificaci\u00f3n por parte del \u00absending\u00bb. Un ejemplo seria Slack, tiene unos puertos a la escucha que por ejemplo cuando se notifica que hay una compilaci\u00f3n, este lo escribe en el canal de Slack correspondiente.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Manos a la obra<\/h2>\n<p>Para empezar nos creamos un proyecto\u00a0\u00a0<strong>MVC + Web API<\/strong>\u00a0 utilizando autenticaci\u00f3n con Cuentas Individuales tal y como se muestra en la siguiente imagen:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2364\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/ExampleWebHook.png\" alt=\"ExampleWebHook\" width=\"790\" height=\"612\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/ExampleWebHook.png 790w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/ExampleWebHook-300x232.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/ExampleWebHook-768x595.png 768w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>A continuaci\u00f3n, en nuestra soluci\u00f3n a\u00f1adiremos los siguientes <strong>paquetes Nugget<\/strong>:<\/p>\n<ul>\n<li><b><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNet.WebHooks.Custom\">Microsoft.AspNet.WebHooks.Custom<\/a>:\u00a0<\/b>Este paquete contiene la funcionalidad b\u00e1sica para a\u00f1adir WebHooks en nuestra aplicaci\u00f3n Asp.NET<\/li>\n<li><b><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNet.WebHooks.Custom.Mvc\">Microsoft.AspNet.WebHooks.Custom.Mvc<\/a>\u00a0\u00a0<\/b>Este paquete contiene Helpers para poder llamar a los WebHooks desde dentro de nuestros controladores MVC<\/li>\n<li><b><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNet.WebHooks.Custom.Api\">Microsoft.AspNet.WebHooks.Custom.Api<\/a>\u00a0<\/b>Este paquete contiene una serie de controladores WebAPI para administrar los filtros y los registros con una interface totalmente REST<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Una vez a\u00f1adido esto dentro de la clase\u00a0<strong>WebApiConfig.Register\u00a0<\/strong>a\u00f1adimos las siguientes l\u00edneas:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n        config.InitializeCustomWebHooks();      \r\n        config.InitializeCustomWebHooksApis();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Los WebHooks los podemos bien guardar en memoria, en una tabla de SQL Server o bien en un BlobStorage de Azure. Por este motivo, hay dos paquetes de Nugget id\u00f3neos\u00a0para administrar estos WebHooks seg\u00fan la opci\u00f3n que decidamos:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Blogs.Components.WeblogFiles\/00\/00\/00\/63\/56\/metablogapi\/5428.SubscriptionStore_thumb_4D000B6B.png\" width=\"500\" height=\"221\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Definici\u00f3n del conjunto de filtros de eventos<\/h2>\n<p>Ahora vamos a ver la definici\u00f3n del conjunto de filtros de eventos que estar\u00e1n disponibles para los consumidores de sus WebHooks. <strong>Los filtros indican qu\u00e9 eventos se pueden subscribir<\/strong>. Por defecto, el sistema registra un filtro comod\u00edn que permite subscribirse a todos los eventos que se exponen. Para ello tendremos que implementar la interfaz IWebHookFilterProvider. Interfaz que solamente expone el m\u00e9todo GetFiltersAsync.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n public class BlogsEncaminaFilter: IWebHookFilterProvider\r\n    {\r\n        private readonly Collection&lt;WebHookFilter&gt;; filters = new Collection&lt;WebHookFilter&gt;;\r\n    {\r\n        new WebHookFilter { Name = &quot;DesarrollandoSobreSharePoint&quot;, Description = &quot;Nuevo Post.&quot;},\r\n        new WebHookFilter { Name = &quot;PorUnaNubeSostenible&quot;, Description = &quot;Nuevo Post.&quot;},\r\n    };\r\n        public Task&lt;Collection&lt;WebHookFilter&gt;&gt; GetFiltersAsync()\r\n        {\r\n            return Task.FromResult(this.filters);\r\n        }\r\n    }\r\n<\/pre>\n<h2><\/h2>\n<h2>Enviando notificaciones<\/h2>\n<p>Una vez implementados los filtros, lo que vamos a hacer es crear diversos controladores que al invocarlos ser\u00e1n los encargados de <strong>enviar dicho evento a todos los subscriptores<\/strong> de dicho WebHook.<\/p>\n<p>A\u00f1adiremos un controlador MVC vac\u00edo que en la acci\u00f3n del Summit generar\u00e1 un evento utilizando el m\u00e9todo NotifyAsync.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n  &#x5B;Authorize]\r\n    public class NotifyController : Controller\r\n    {\r\n        &#x5B;HttpPost]\r\n        public async Task&lt;ActionResult&gt; Submit()\r\n        {\r\n            \/\/ Create an event with action 'event1' and additional data\r\n            await this.NotifyAsync(&quot;DesarrollandoSobreSharePoint&quot;, new { Titulo = &quot;Nuevo post&quot; });\r\n\r\n            return new EmptyResult();\r\n        }\r\n    }\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Para poder llamar a este m\u00e9todo, se debe realizar con un usuario autenticado. En caso de que no lo pongamos, no se realizar\u00e1 la petici\u00f3n.<\/p>\n<p>Para el caso de una <strong>WebAPi<\/strong> el c\u00f3digo es muy similar:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n &#x5B;Authorize]\r\n    public class NotifyApiController : ApiController\r\n    {\r\n        public async Task Post()\r\n        {\r\n            \/\/ Create an event with 'event2' and additional data\r\n            await this.NotifyAsync(&quot;PorUnaNubeSostenible&quot;, new { Titulo = &quot;Nuevo articulo&quot; });\r\n        }\r\n    }\r\n<\/pre>\n<h2><\/h2>\n<h2>Creando un Receptor<\/h2>\n<p>Una vez tenemos creado el Sending, en nuestra aplicaci\u00f3n crearemos un Receptor para comprobar el <strong>correcto funcionamiento<\/strong> del mismo. Para ello, en primer lugar agregaremos el siguiente paquete Nuget:<\/p>\n<p><b><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNet.WebHooks.Receivers.Custom\/1.2.0-beta\">Microsoft.AspNet.WebHooks.Receivers.Custom<\/a>\u00a0\u00a0<\/b>Dentro del fichero\u00a0<strong>WebApiConfig.Register\u00a0<\/strong>a\u00f1adiremos la siguiente linea:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nconfig.InitializeReceiveCustomWebHooks();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>En el WebConfig tambi\u00e9n a\u00f1adiremos la siguiente entrada, en la que indicamos el token key de nuestro webHook.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;appSettings&gt;\r\n&lt;add key=&quot;MS_WebHookReceiverSecret_Custom&quot; value=&quot;12345678901234567890123456789012&quot;\/&gt;\r\n&lt;\/appSettings&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>A cotinuaci\u00f3n nos creamos una clase TestHandler que hereda de WebHookHandler. <strong>Este ser\u00e1 el punto de nuestra aplicaci\u00f3n que estar\u00e1 permanentemente a la escucha de que se notifique un WebHook.<\/strong> Para ello, implementaremos el siguiente c\u00f3digo:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n public class TestHandler : WebHookHandler\r\n    {\r\n        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)\r\n        {\r\n            return Task.FromResult(true);\r\n        }\r\n    }\r\n<\/pre>\n<p>Ahora para probar agregaremos el siguiente c\u00f3digo, que lo que hace es <strong>suscribirnos a todos los eventos del WebHook y tenemos llamadas a los m\u00e9todos<\/strong> en el NotifyApiController y NotifyController. Para ello agregamos el siguiente c\u00f3digo en la vista Views\/Home\/Index.cshtml<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\n&lt;form onsubmit=&quot;return subscribe()&quot;&gt;\r\n    Subscribe to all events &lt;input type=&quot;submit&quot; value=&quot;submit&quot;&gt;\r\n&lt;\/form&gt;\r\n&lt;form onsubmit=&quot;return unsubscribe()&quot;&gt;\r\n    Unsubscribe from all events &lt;input type=&quot;submit&quot; value=&quot;submit&quot;&gt;\r\n&lt;\/form&gt;\r\n&lt;form onsubmit=&quot;return notifymvc()&quot;&gt;\r\n    Trigger notification through MVC controller &lt;input type=&quot;submit&quot; value=&quot;submit&quot;&gt;\r\n&lt;\/form&gt;\r\n&lt;form onsubmit=&quot;return notifyapi()&quot;&gt;\r\n    Trigger notification through Web API controller &lt;input type=&quot;submit&quot; value=&quot;submit&quot;&gt;\r\n&lt;\/form&gt;\r\n\r\n&lt;script&gt;\r\nfunction subscribe() {\r\n    $.ajax({\r\n        type: &quot;POST&quot;,\r\n        url: &quot;\/api\/webhooks\/registrations&quot;,\r\n        data: JSON.stringify({\r\n            WebHookUri: &quot;http:\/\/localhost:23224\/api\/webhooks\/incoming\/custom&quot;,\r\n            Secret: &quot;12345678901234567890123456789012&quot;,\r\n            Description: &quot;My first WebHook!&quot;\r\n        }),\r\n        contentType: &quot;application\/json; charset=utf-8&quot;,\r\n        dataType: &quot;json&quot;,\r\n        success: function(data, status) { alert(status); },\r\n        failure: function(errMsg) { alert(errMsg); }\r\n    });\r\n    return false;\r\n}\r\n\r\nfunction unsubscribe() {\r\n    $.ajax({\r\n        url: &quot;\/api\/webhooks\/registrations&quot;,\r\n        type: 'DELETE',\r\n        success: function (data, status) { alert(status); },\r\n        failure: function(errMsg) { alert(errMsg); }\r\n    });\r\n    return false;\r\n}\r\n\r\nfunction notifymvc() {\r\n    $.post(&quot;\/notify\/submit&quot;,\r\n    { },\r\n    function (data, status) { alert(&quot;Data: &quot; + data + &quot;\\nStatus: &quot; + status); });\r\n    return false;\r\n}\r\n\r\nfunction notifyapi() {\r\n    $.post(&quot;\/api\/notifyapi&quot;,\r\n    { },\r\n    function (data, status) { alert(&quot;Data: &quot; + data + &quot;\\nStatus: &quot; + status); });\r\n    return false;\r\n}\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Si ahora\u00a0nos subscribimos a los eventos que nos proporciona el WebHook, lanzamos uno de ellos y ponemos un punto de parada en el Handler, veremos lo siguiente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2374\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Handler-1024x172.png\" alt=\"Handler\" width=\"1024\" height=\"172\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Handler-1024x172.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Handler-300x51.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Handler-768x129.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/Handler.png 1176w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Resumen<\/h2>\n<h3>WebHooks es una nuevo patr\u00f3n\/utilidad muy \u00fatil para comunicar nuestra aplicaci\u00f3n con terceros.<\/h3>\n<p>En el tiempo en el que el Cloud es una realidad, los WebHooks son\u00a0una forma simple y sencilla que <strong>permite a nuestra aplicaci\u00f3n la comunicaci\u00f3n con terceras aplicaciones de la forma menos costosa posible.<\/strong> En siguientes art\u00edculos veremos c\u00f3mo incorporarlos a SharePoint Online en sustituci\u00f3n de los Remote Event Receivers.<\/p>\n<p>El c\u00f3digo lo ten\u00e9is disponible para descargar en mi repositorio de GitHub \ud83d\ude09<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2377 size-large\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/github-1024x380.png\" alt=\"github\" width=\"1024\" height=\"380\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/github-1024x380.png 1024w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/github-300x111.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/github-768x285.png 768w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/07\/github.png 1125w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p><strong>Bibliograf\u00eda<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/aspnet\/WebHooks\" target=\"_blank\">https:\/\/github.com\/aspnet\/WebHooks\u00a0<\/a><\/li>\n<li><a href=\"http:\/\/www.hanselman.com\/blog\/IntroducingASPNETWebHooksReceiversWebHooksMadeEasy.aspx\" target=\"_blank\">http:\/\/www.hanselman.com\/blog\/IntroducingASPNETWebHooksReceiversWebHooksMadeEasy.aspx<\/a><\/li>\n<\/ul>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Los tiempos en el desarrollo van cambiando y junto a ello naturalmente las herramientas de desarrollo, los patrones y la forma en la que se hacen las cosas. Un claro ejemplo son los Event Receiver y los WebHook. Hasta hace &hellip; <a href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[175],"tags":[176],"class_list":["post-2360","post","type-post","status-publish","format-standard","hentry","category-asp-net","tag-asp-net-webhook"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>C\u00f3mo montar un WebHook con ASP.NET<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"C\u00f3mo montar un WebHook con ASP.NET\" \/>\n<meta name=\"twitter:description\" content=\"Los tiempos en el desarrollo van cambiando y junto a ello naturalmente las herramientas de desarrollo, los patrones y la forma en la que se hacen las cosas. Un claro ejemplo son los Event Receiver y los WebHook. Hasta hace &hellip; Continue reading &rarr;\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n D\u00edaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/\"},\"author\":{\"name\":\"Adri\u00e1n D\u00edaz\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"headline\":\"Introducci\u00f3n a WebHooks\",\"datePublished\":\"2016-07-05T08:00:25+00:00\",\"dateModified\":\"2016-07-07T10:10:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/\"},\"wordCount\":1428,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2016\\\/06\\\/webhooks.png\",\"keywords\":[\"asp.net webhook\"],\"articleSection\":[\"ASP.NET\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/\",\"name\":\"C\u00f3mo montar un WebHook con ASP.NET\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2016\\\/06\\\/webhooks.png\",\"datePublished\":\"2016-07-05T08:00:25+00:00\",\"dateModified\":\"2016-07-07T10:10:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2016\\\/06\\\/webhooks.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2016\\\/06\\\/webhooks.png\",\"width\":472,\"height\":225},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/\",\"name\":\"Desarrollando sobre SharePoint\",\"description\":\"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\",\"name\":\"Adri\u00e1n D\u00edaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"caption\":\"Adri\u00e1n D\u00edaz\"},\"description\":\"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/author\\\/desarrollandosobresharepoint\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo montar un WebHook con ASP.NET","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/","twitter_card":"summary_large_image","twitter_title":"C\u00f3mo montar un WebHook con ASP.NET","twitter_description":"Los tiempos en el desarrollo van cambiando y junto a ello naturalmente las herramientas de desarrollo, los patrones y la forma en la que se hacen las cosas. Un claro ejemplo son los Event Receiver y los WebHook. Hasta hace &hellip; Continue reading &rarr;","twitter_image":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png","twitter_misc":{"Escrito por":"Adri\u00e1n D\u00edaz","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/"},"author":{"name":"Adri\u00e1n D\u00edaz","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"headline":"Introducci\u00f3n a WebHooks","datePublished":"2016-07-05T08:00:25+00:00","dateModified":"2016-07-07T10:10:11+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/"},"wordCount":1428,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png","keywords":["asp.net webhook"],"articleSection":["ASP.NET"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/","name":"C\u00f3mo montar un WebHook con ASP.NET","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png","datePublished":"2016-07-05T08:00:25+00:00","dateModified":"2016-07-07T10:10:11+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/webhooks-que-son-y-como-utilizarlos-en-nuestros-desarrollos\/#primaryimage","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png","contentUrl":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2016\/06\/webhooks.png","width":472,"height":225},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/","name":"Desarrollando sobre SharePoint","description":"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb","name":"Adri\u00e1n D\u00edaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","caption":"Adri\u00e1n D\u00edaz"},"description":"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/author\/desarrollandosobresharepoint\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/2360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/comments?post=2360"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/2360\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/media?parent=2360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/categories?post=2360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/tags?post=2360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}