<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://liarjo.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fliarjo.spaces.live.com%2fcategory%2fQ__x7A%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>..:: Liarjo of Locksley ::..: Q&amp;A</title><description /><link>http://liarjo.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catQ__x7A</link><language>en-US</language><pubDate>Wed, 27 Aug 2008 16:16:29 GMT</pubDate><lastBuildDate>Wed, 27 Aug 2008 16:16:29 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://liarjo.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>4697793537861464105</live:id><live:alias>liarjo</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>Metodología para proyectos de Minería de Datos</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!3634.entry</link><description>&lt;p&gt;El gran parte del éxito de un proyecto de software, en empresas de desarrollo, se basa en su forma de trabajo. Esta metodología que usan les sirve para que los miembros del equipo sepan que deben hacer y cuando. Existen muchas metodologías de todos los sabores y colores, en mi opinión todas suman dependiendo del contexto hay que optar por la más eficaz. &lt;p&gt;Ahora, en los proyecto de minería de datos al igual que en los proyectos de cualquier cosa es necesario seguir una forma de trabajo, es decir una metodología. Aquí les comparto la metodología CRISP –DM, que es libre y se hace cargo de definir cómo y cuando las cosas deben ser hechas.  &lt;p&gt;Al igual que cualquier metodología es un modelo y no un manual de corta palos, ustedes deben adecuarla a la realidad de su propio entorno. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;CRISP-DM&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;La metodología CRISP-DM consta de cuatro niveles de abstracción, organizados de forma jerárquica en tareas que van desde el nivel más general hasta los casos más específicos.  &lt;p&gt;A nivel más general, el proceso está organizado en seis fases, estando cada fase a su vez estructurada en varias tareas generales de segundo nivel. Las tareas generales se proyectan a tareas específicas, donde se describen las acciones que deben ser desarrolladas para situaciones específicas. Así, si en el segundo nivel se tiene la tarea general “limpieza de datos”, en el tercer nivel se dicen las tareas que tienen que desarrollarse para un caso específico, como por ejemplo, “limpieza de datos numéricos”, o “limpieza de datos categóricos”. El cuarto nivel, recoge el conjunto de acciones, decisiones y resultados sobre el proyecto de Data Mining específico.  &lt;p&gt;La metodología CRISP-DM estructura el ciclo de vida de un proyecto de Data Mining en seis fases, que interactúan entre ellas de forma iterativa durante el desarrollo del proyecto. &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1pgc-mUni5RRa_LFzLDfuLw0p7Id2UjVQ7rpcXu1BkwwWlbWB1I_Osd8XFvz8ITaej?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=243 alt=Crisp-dm src="http://byfiles.storage.msn.com/y1pSRfiVDIxHXOEAhbnH1ly-QzVtRmOjLQZ2346ok_YNzQ88PIBQLOR_7N2i7Mk4agCQtzLdzP9vOA?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt;  &lt;p&gt;  &lt;p&gt;La primera fase análisis del problema, incluye la comprensión de los objetivos y requerimientos del proyecto desde una perspectiva empresarial, con el fin de convertirlos en objetivos técnicos y en una planificación.  &lt;p&gt;La segunda fase de análisis de datos comprende la recolección inicial de datos, en orden a que sea posible establecer un primer contacto con el problema, identificando la calidad de los datos y estableciendo las relaciones más evidentes que permitan establecer las primeras hipótesis.  &lt;p&gt;Una vez realizado el análisis de datos, la metodología establece que se proceda a la preparación de los datos (tercera fase), de tal forma que puedan ser tratados por las técnicas de modelado. La preparación de datos incluye las tareas generales de selección de datos a los que se va a aplicar la técnica de modelado (variables y muestras), limpieza de los datos, generación de variables adicionales, integración de diferentes orígenes de datos y cambios de formato.  &lt;p&gt;La fase de preparación de los datos, se encuentra muy relacionada con la fase de modelado (cuarta fase), puesto que en función de la técnica de modelado que vaya a ser utilizada los datos necesitan ser procesados en diferentes formas. Por lo tanto las fases de preparación y modelado interactúan de forma sistemática. En la fase de modelado se seleccionan las técnicas de modelado más apropiadas para el proyecto de Data Mining específico. Las técnicas a utilizar en esta fase se seleccionan en función de los siguientes criterios: &lt;p&gt;  &lt;ul&gt; &lt;li&gt;Ser apropiada al problema.  &lt;li&gt;Disponer de datos adecuados.  &lt;li&gt;Cumplir los requerimientos del problema.  &lt;li&gt;Tiempo necesario para obtener un modelo.  &lt;li&gt;Conocimiento de la técnica. &lt;/ul&gt; &lt;p&gt;Antes de proceder al modelado de los datos se debe de establecer un diseño del método de evaluación de los modelos, que permita establecer el grado de bondad de los modelos. Una vez realizadas estas tareas genéricas se procede a la generación y evaluación del modelo. Los parámetros utilizados en la generación del modelo dependen de las características de los datos. &lt;p&gt;En la quinta fase, la fase de evaluación, se evalúa el modelo, no desde el punto de vista de los datos, sino del cumplimiento de los criterios de éxito del problema. Se debe revisar el proceso seguido, teniendo en cuenta los resultados obtenidos, para poder repetir algún paso en el que, a la vista del desarrollo posterior del proceso, se hayan podido cometer errores. Si el modelo generado es válido en función de los criterios de éxito establecidos en la primera fase, se procede a la explotación del modelo.  &lt;p&gt;Normalmente los proyectos de Data Mining no terminan en la implantación del modelo (sexta fase), sino que se deben documentar y presentar los resultados de manera comprensible en orden a lograr un incremento del conocimiento. Además en la fase de explotación se debe de asegurar el mantenimiento de la aplicación y la posible difusión de los resultados. &lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pHYbM4paFRPZ8rdHfL2O9M6AyGBb3kb3DLxIPS1pjYqxPL6khsR2s7zwje7TtrEUP6Ndm3S9XNBZPCvSQcTSEyg?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=295 alt=image src="http://byfiles.storage.msn.com/y1pHdyUzvNA9dLIwUWrASCJaGhNjymPRQ8ex4TaeVt_QXur7xHpfeauGVBSZZxsmTj7bs7F-2u42LU?PARTNER=WRITER" width=555 border=0&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 1 Entendimiento del Negocio&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;Esta fase se centra en la comprensión de los objetivos del proyecto y los requisitos desde una perspectiva de negocio, a continuación, convertir ese conocimiento en una definición de una solución de minería datos y un plan preliminar para lograr los objetivos del negocio. &lt;p&gt;Las tareas de esta fase con las siguientes: &lt;p&gt;1. &lt;strong&gt;Determinar los objetivos del negocio&lt;/strong&gt;: comprender completamente desde la perspectiva del negocio lo que el cliente realmente quiere. Además, se deben identificar factores importantes que puedan influir en el desarrollo del proyecto, al principio del mismo. En resumen evitar gastar mucho tiempo respondiendo correctamente a las preguntas de negocio incorrectas.  &lt;p&gt;2. &lt;strong&gt;Evaluar la situación&lt;/strong&gt;: darse cuenta de la real situación del escenario dónde se realizará el proyecto. &lt;p&gt;3. &lt;strong&gt;Determine las metas del proyecto BI&lt;/strong&gt;: en esta actividad se busca expresar los objetivos de negocio del proyecto en términos técnicos. &lt;p&gt;4. &lt;strong&gt;Elaborar el plan del proyecto&lt;/strong&gt;: construir el plan para alcanzar los objetivos de minería de datos y los objetivos de negocio. Este plan debe describir las actividades y pasos a seguir durante el resto del proyecto, incluyendo la selección inicial de herramientas y tecnologías. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 2 Entendimiento de los Datos&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;Esta fase se inicia con una primera recopilación de datos y procede con las actividades específicas a fin de familiarizarse con los datos, para identificar problemas de calidad de los datos, primero para descubrir una visión de los datos o para detectar subconjuntos interesantes para formar las hipótesis de información oculta. &lt;p&gt;Las tareas de esta fase con las siguientes: &lt;p&gt;1. &lt;strong&gt;Recopilar los Datos iníciales&lt;/strong&gt;: obtener los datos relevantes para este proyecto. Puede ser necesario cargar estos datos para poder revisarlos bien y lograr entender en que estado se encuentran. &lt;p&gt;2. &lt;strong&gt;Descripción de los Datos&lt;/strong&gt;: describir los datos, sus propiedades y sus medidas. Se elabora un informe de esto. &lt;p&gt;3. &lt;strong&gt;Revisar los Datos&lt;/strong&gt;: esta tarea aborda los aspectos de BI del proyecto los cuales pueden abordarse con consultas, visualización y presentación de informes. &lt;p&gt;4. &lt;strong&gt;Verificar la calidad de datos&lt;/strong&gt;: examinar la calidad de los datos, buscando validar la completitud y veracidad de los datos. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 3 Preparación de los datos&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;Cubre todas las actividades encaminadas a construir los datos finales a partir de los datos en bruto. Las tareas de preparación de datos probablemente se realizan varias veces, en diferentes ordenes. Sus tareas incluyen la tabla, registro y selección de atributos, así como la transformación y limpieza de datos para herramientas de modelado. Normalmente está fase toma el mayor esfuerzo del proyecto. &lt;p&gt;Las tareas de esta fase con las siguientes: &lt;p&gt;1. Seleccionar los Datos: Decidir sobre los datos que deben utilizarse para el análisis. Incluir criterios de pertinencia de los datos para los objetivos, la calidad y técnicas tales como las limitaciones de volumen de datos o tipos de datos. Esta tarea Cubre la selección de atributos, así como la selección de registros en una tabla. &lt;p&gt;2. Limpieza de los datos: aquí buscamos elevar a calidad de los datos al nivel requerido por las técnicas de BI seleccionadas en el proyecto. &lt;p&gt;3. Construcción de los datos: tarea orientada a la construcción o cálculo de los atributos calculados o nuevos registros requeridos por el modelo de gestión y no provisto por los datos brutos u operacionales. &lt;p&gt;4. Integración de Datos: tarea orientada a la integración de los datos de gestión generados a los modelos. &lt;p&gt;5. Aplicar formatos a los datos. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 4 Modelamiento&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;En esta fase varias técnicas de modelamiento son seleccionadas y aplicadas, y sus parámetros son calibrados buscando los valores óptimos. Típicamente, existen varias técnicas para resolver un mismo problema de minería de datos. Algunas técnicas tienen requerimientos específicos en la forma de los datos. Por esto a menudo hay que volver a la fase de preparación de datos en estos cosos. &lt;p&gt;Las tareas de esta fase con las siguientes: &lt;p&gt;1. Seleccionar la técnica de modelamiento &lt;p&gt;2. Construcción del modelo de pruebas &lt;p&gt;3. Implementación del modelo &lt;p&gt;4. Evaluación del modelo &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 5 Evaluación&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;A estas alturas del proyecto ya se han construido el o los modelos los que aparenta ser correctos, desde la perspectiva del análisis de datos. Antes de proceder a la instalación final del modelo, es importante una evaluación a fondo del modelo y los pasos seguidos para su implementación para estar seguro que cumple con los objetivos de negocio. El objetivo clave es determinar si hay algún asunto de negocios que no se haya tratado con la suficiente profundidad. Al final de esta etapa se debe tener la certeza que los objetivos de negocio fueron alcanzados. &lt;p&gt;1. Evaluación de los resultados &lt;p&gt;2. Revisión del proceso &lt;p&gt;3. Determinar los próximos pasos &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Fase 6 Transferencia&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;La creación del modelo generalmente no es el final del proyecto. Incluso si la finalidad del modelo es aumentar el conocimiento de los datos, los conocimientos adquiridos tendrán que ser organizados y presentados de manera que el cliente puede utilizarlo. Dependiendo de los requisitos, la fase de despliegue puede ser tan simple como generar un informe o tan compleja como la aplicación de una repetible proceso de minería de datos. En muchos casos será el cliente, no el analista de datos, que llevará a cabo los pasos de instalación. Sin embargo, incluso si el analista no lleva acabo la trasferencia el esfuerzo es importante para que el cliente pueda comprender por adelantado qué medidas tendrán que ser llevadas a cabo con el fin de realmente hacer uso de los modelos creados &lt;p&gt;1. Plan de transferencia &lt;p&gt;2. Plan de monitoreo y mantenimiento &lt;p&gt;3. Producción del reporte final. &lt;p&gt;4. Revisión del Proyecto &lt;p&gt;Mas información en las referencias. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Referncias&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;1.- &lt;a title="http://www.crisp-dm.org/" href="http://www.crisp-dm.org/" target="_blank"&gt;CRoss Industry Standard Process&lt;/a&gt; &lt;p&gt;2.- &lt;a title="http://www.estadistico.com/arts.html?20040426" href="http://www.estadistico.com/arts.html?20040426" target="_blank"&gt;Metodologías para la Realización de Proyectos de Data Mining&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+Metodolog%c3%ada+para+proyectos+de+Miner%c3%ada+de+Datos&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!3634.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!3634.entry</guid><pubDate>Fri, 25 Jul 2008 21:28:59 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!3634/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!3634.entry#comment</wfw:comment><dcterms:modified>2008-07-25T21:31:03Z</dcterms:modified></item><item><title>¿Cómo hacer un Servicio Windows en C#?</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2774.entry</link><description>&lt;p&gt;Los servicios Windows son programas que corren en background independiente del usuario que tenga sesiones activas en un server. Los usamos para múltiples tareas por ejemplo monitorear el estado de un Servicio Web. 
&lt;p&gt;Un cliente me pregunta cómo se puede hacer un servicio que monitoree un servicio Web y su tiempo de respuesta. 
&lt;p&gt;Fácil, hay que hacer un servicio Windows en C# ;) 
&lt;h3&gt;&lt;font color="#baf56b"&gt;Respuesta&lt;/font&gt;&lt;/h3&gt;
&lt;p&gt;Los pasos para construir un servicio Windows, utilizando C# son los siguientes: 
&lt;ol&gt;
&lt;li&gt;Crear un proyecto del tipo Windows Services. 
&lt;li&gt;Implementar la lógica del Servicio. 
&lt;li&gt;Agregar los parámetros de instalación del servicio. 
&lt;li&gt;Crear un proyecto de Instalación. 
&lt;li&gt;Instalar 
&lt;li&gt;Extra, ¿cómo hacer Debug?&lt;/ol&gt;
&lt;h4&gt;Paso 1: Crear un proyecto del tipo Windows Services.&lt;/h4&gt;
&lt;p&gt;Visual Studio tiene un tipo de proyecto especial para crear servicios Windows. En el cuadro de dialogo ‘New Project’ hay que seleccionar la opción ‘Windows Services’ como muestra la figura 1. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yinMCStkoDcyOpAQZ1Rwlovs4ZbCQ39cFAfX95M5Wi1wjJowZufnuwvwJuwjaSY-5ihWzHICEZf5Un7yoW4J686?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="New Project" src="http://by1.storage.msn.com/y1pEbp1yuGPmyIAEpB3DOMk-H82dQdpyVofQMwu5NvCBgKytI9i0ziEVOglzlBzgAzFohCRWX3VbodoLtZhKR79mOowjo9EzGZR?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 1. 
&lt;p&gt;Como resultado de esto se crea una clase llamada Service1 que contiene los siguientes métodos: 
&lt;p&gt;&lt;strong&gt;Service1():&lt;/strong&gt; constructor de la clase, aquí debemos incluir la configuración del Servicio. 
&lt;p&gt;&lt;strong&gt;OnStart(string[] args):&lt;/strong&gt; Evento cuando el servicio se inicia. Esto ocurre cada vez que el servicio comienza a funcionar. 
&lt;p&gt;&lt;strong&gt;OnStop():&lt;/strong&gt; Evento cuando el servicio se detiene. Aquí se deben eliminar todos los recursos que el servicio utiliza. 
&lt;p&gt;  
&lt;h4&gt;Paso 2: Implementar la lógica del Servicio&lt;/h4&gt;
&lt;p&gt;Este servicio debe hacer lo siguiente: 
&lt;ol&gt;
&lt;li&gt;Consumir un Servicio Web cada cierto periodo de tiempo. 
&lt;li&gt;Validar que el Servicio Web resposponda (no se caiga). 
&lt;li&gt;Validar que el tiempo de respuesta en menor que cierto valor. 
&lt;li&gt;Mantener en configuración la URL del Servicio Web, periodo de tiempo en que se repiten las llamadas y el tiempo de respuesta máximo.&lt;/ol&gt;
&lt;p&gt;Para consumir un Servicio Web utilizamos la funcionalidad de Visual Studio ‘Add Web Reference’ que se muestra en la figura 2. En este ejemplo utilizaré el servicio gratuito de  &lt;a title=WebServiceX href="http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=46" target="_blank"&gt;WebServiceX&lt;/a&gt;. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yg5wPIpRyfZcu_yx5FrUomptT-6aH0_EK-7gIXBLbuC9m_DCDUG4xmnvMrt-iIf2apR0qs1fMDPgSEgMUIQg5am?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Add Web Reference......" src="http://by1.storage.msn.com/y1pEbp1yuGPmyKiu0EuvlNaCBNF9XHWGZY1XjqevZ7Mlf4pvcU4xtMm7zwiXG0upWJrwHPZIu8tRBq2ZcsLqKTOg2gHYCAxAF_J?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 2. 
&lt;p&gt;Para realizar la tarea repetitiva de llamar al servicio Web cada cierto intervalo de tiempo utilizaremos un objeto del tipo System.Timers.Timer. Este objeto tiene la capacidad de levantar un evento cuando pasa cierto periodo de tiempo desde que se activa. En este caso la construcción del Timer se realzia en el método onStart del Servicio Windows, es decir cuando el servicio de levanta comienza a trabajar el Timer. Esto se muestra en el código 1. 
&lt;p&gt;  
&lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="border-right:#92d050 1pt solid;padding-right:5.4pt;border-top:#92d050 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#92d050 1pt solid;width:475pt;padding-top:0in;border-bottom:#92d050 1pt solid" valign=top width=633&gt;
&lt;p style="margin-bottom:0pt;line-height:normal"&gt;&lt;span&gt;&lt;/span&gt;  
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OnStart(&lt;span style="color:#0000ff"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Timer para el control del tiempo entre llamadas.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     myTimer = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; System.Timers.Timer();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Intervalo de tiempo entre llamadas.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     myTimer.Interval = 1500;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Evento a ejecutar cuando se cumple el tiempo.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;     myTimer.Elapsed += &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; System.Timers.ElapsedEventHandler(myTimer_Elapsed);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Habilitar el Timer.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;     myTimer.Enabled = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Código 1. 
&lt;p&gt;En el evento myTimer_Elapsed se hace la llamada al Servicio Web. Pero, para evitar problemas de concurrencia se detiene el Timer antes de hacer la llamada y luego se vuelve a activar. Esto se muestra en el código 2. 
&lt;p&gt;  
&lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="border-right:#92d050 1pt solid;padding-right:5.4pt;border-top:#92d050 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#92d050 1pt solid;width:475pt;padding-top:0in;border-bottom:#92d050 1pt solid" valign=top width=633&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; myTimer_Elapsed(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, System.Timers.ElapsedEventArgs e)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Detiene el Timer&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     myTimer.Enabled = &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//llama al Servicio Web&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     CallServicioWeb();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//habilita el Timer nuevamente.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;     myTimer.Enabled = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Código 2. 
&lt;p&gt;Por último el método CallServicioWeb() hace la llamada y controla el tiempo de respuesta del Servicio. En el código 3 se puede ver la lógica de esto. 
&lt;p&gt;  
&lt;p&gt;&lt;span&gt;&lt;/span&gt;
&lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="border-right:#92d050 1pt solid;padding-right:5.4pt;border-top:#92d050 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#92d050 1pt solid;width:475pt;padding-top:0in;border-bottom:#92d050 1pt solid" valign=top width=633&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; CallServicioWeb()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000"&gt;//Proxy&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     SerivicioWeb.GeoIPService Proxy = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; ServicioWindowsMonitor.SerivicioWeb.GeoIPService();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;     DateTime Tini;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     TimeSpan Tdif;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;         &lt;span style="color:#008000"&gt;//Tiempo de inicio de la llamada&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;         Tini = DateTime.Now;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt;         &lt;span style="color:#008000"&gt;//llamada al servicio &lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  12:&lt;/span&gt;         Proxy.GetGeoIP(&lt;span style="color:#006080"&gt;&amp;quot;200.10.12.126&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  13:&lt;/span&gt;         &lt;span style="color:#008000"&gt;//Tiempo de respuesta&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  14:&lt;/span&gt;         Tdif=Tini.Subtract(DateTime.Now);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (Tdif.Seconds &amp;lt; -10)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  16:&lt;/span&gt;         {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  17:&lt;/span&gt;             Log(&lt;span style="color:#006080"&gt;&amp;quot;Servicio Lento: &amp;quot;&lt;/span&gt; + Tdif.Seconds.ToString()+ &lt;span style="color:#006080"&gt;&amp;quot;[S]&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  19:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  20:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (Exception X)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  21:&lt;/span&gt;     {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  22:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  23:&lt;/span&gt;         Log(X.Message);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  25:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Código 3. 
&lt;h4&gt;Paso 3: Agregar los parámetros de instalación del servicio.&lt;/h4&gt;
&lt;p&gt;Para que el servicio pueda ser controlado por el administrador de servicios de Windows debemos agregar dos componentes a nuestro Servicio Windows: 
&lt;p&gt;  
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;serviceProcessInstaller&lt;/strong&gt;: en este componente se debe fijar el usuario con que se ejecuta el servicio. En este caso utilizamos la cuenta Local Service. 
&lt;li&gt;&lt;strong&gt;serviceInstaller&lt;/strong&gt;: Este componente tiene la propiedad ServiceName, que define el nombre con que el Servicio aparece en la consola de Servicios. En este caso lo llamaremos ‘Monitor GeoIP’. Además este componente tiene la propiedad StartType que define si el servicio parte de manera automatica, manual o está desabilitado.&lt;/ul&gt;
&lt;p&gt;Para instalar estos componentes, en la vista de diseño del Servicio Windows usamos la opción ‘add Instaler’ del botón derecho. Esto se muestra en la figura 2. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_ygLqsKHN3bv6SktQs5IMgKOxt84uPmXlkt3r3o_ldXmDboftoilNZeBG9lSQcaHGnHUIIHZoDWPDOYluyka-Oax?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Add Install" src="http://by1.storage.msn.com/y1pEbp1yuGPmyKW1lY1WPkq9x-unFaAZQ_8aSKgsd2bazjLS5kFlBZQku7SzIwo6hCSxy4UhBER6wScU8kZ-Vz0RvgHWmPO2FGn?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 2. 
&lt;h4&gt;Paso 4: Crear un proyecto de Instalación&lt;/h4&gt;
&lt;p&gt;Para utilizar el servicio es necesario crear un instalador. Este proyecto instala el software del Servicio Windows en el disco, lo registra y agrega a la consola de servicios del sistema operativo. 
&lt;p&gt;Para crear un proyecto de instalación debemos utilizar el dialogo ‘New Project’ con la opción ‘Setup’ como muestra la figura 3. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yjl9kmKTErNPQ9IJW3QVDclljrE3x59DVNQawRXnFgzE5_ap6LKFhQmWo_-Mg5JURIEYEJFlhQOTTJac1GPlk--?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="New Project Setup" src="http://by1.storage.msn.com/y1pEbp1yuGPmyIb4fNgaXUnSBOHakbTZLSzmvEuK7qJmgBhHLD-DS91qwrVxY97DPY3HEK02nqX3bviFMpgIJgZwDsE52EX_Xes?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 3. 
&lt;p&gt;Una vez creado el proyecto debemos agregar a este proyecto de instalación en la carpeta ‘Application Folder’ el proyecto de salida. Este es nuestro proyecto de Servicio Windows. La figura 4 muestra cómo hacerlo usando el botón derecho. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yjDLZyG9hL12yVBBlEfgm7worhYTS4CqcnSyHce440l0ZXrnTpZffI2hF9jjaQtvBTzoHJHwGpfODYHhKQMVJ1P?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Add output project" src="http://by1.storage.msn.com/y1pEbp1yuGPmyJgZQ9V08441xm5Z9npS_5YMg9tGiYth9RSiH0janz1Fmr_Zn7Tjh5xr7-CePCjdpHEs87_XerHo42_FkUmkIlw?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 4. 
&lt;p&gt;El siguiente paso es agregar este proyecto de salida a las acciones Install, Commit, RollBack y Uninstall. Para ello en la pestaña ‘Solution Explorer’ seleccionamos el botón ‘Custom Action Editor’. Luego en ese editor, agregamos el proyecto a todas las acciones, como lo muestra la figura 5. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yht-k3RUcKSvAuGqmdajCBZUJLR3P5dP6bJmTGCdBHGNz9W4zfBdlaM3sE93DWFdzULxOSztfl-Lfshyad-vVEr?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Add Custom Task" src="http://by1.storage.msn.com/y1pEbp1yuGPmyJ_ap970M-huoUOM52ZlNf6b2PvcZj-ttQpJSoUoA55kLb-reeXsCt0-2nnwzp8J_OIRaByxrNe9Ouus6P1WDdB?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 5. 
&lt;h4&gt;Paso 5: Instalar&lt;/h4&gt;
&lt;p&gt;Para instalar el Servicio Windows debemos hacer un Built del instalador y luego con el botón derecho sobre el proyecto de instalación ejecutar la instlación. 
&lt;p&gt;Una vez instalado, siguiendo los pasos del Wizard, podemos ver el servicio en la consola de servicios del sistema operativo. En la figura 6 se puede ver las propiedades del evento que ya está en la consola de servicios!!!! 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yiT4U5HuDE9w8O4SSw4tCxYY9g68jGko3miW18qIYwzugxIFmGFaWX-kipFg7HAN1oVw_c0NIiM5zbvqHFrl40r?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Servicio Monitor Geo" src="http://by1.storage.msn.com/y1pEbp1yuGPmyLOpiOI9mGWPV3pZflonIs6QRa1jBKD-2yDL0gtL5Udg0UQJ7JhpF5kpZSITRQNu7nWi7mQXfXoJSWjrfH-0ggR?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 6. 
&lt;h4&gt;Paso 6: Bonus, Hacer Debug del Servicio.&lt;/h4&gt;
&lt;p&gt;Para poder hacer debug del servicio podemos hacer un Attach del proceso. Ojo, esto es posible poque lo compilamos en modo Debug. Para hacerlo vamos al menu Debug de Visual Studio, opción Attach. Cuando aparece el dialogo de procesos hay que buscar en la lista el nombe del servicio y apretar el botón attach. En ese momento Visual Studio entra en modo de debug. El dialogo de Attach se muestra en la figura 7. 
&lt;p&gt;&lt;a href="http://uo87qq.bay.livefilestore.com/y1pAS-CrAYA_yiwKcdpnpMkhUfY2nTv0kccdSjwX5ZtwxxtSyW4TFRTlasRqZrAVIKtZXL2X0tS8WOTMJ7I_aSgKJ8dwyjIqaJq?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt="Attach Process Debug" src="http://by1.storage.msn.com/y1pEbp1yuGPmyLEeqKmtLYUEuXVyIZ4e4KHvErAULw-8kA7kgn6HOp733vC8hK36tQy28O_uCcY-WUjJ2Ip6tJ8JL2pJrzoVcyi?PARTNER=WRITER" width=244 border=0&gt;&lt;/a&gt; 
&lt;p&gt;Figura 7. 
&lt;p&gt;Una vez que se está en modo de debug, se puede poner un punto de interupción en el código y hacer debug a gusto. 
&lt;p&gt;Esto es lo básico para desarrollar un Servicio Windows, con esto pueden construir desde un sencillo servicio de monitoreo hasta complejos Host de Windows Comunication Foundation por ejemplo. 
&lt;p&gt;El código de ejemplo de esta demos pueden bajarlo desde &lt;a title="Código C# de Ejemplo Servicio Windows" href="http://desarrollo.datco.cl/materialpublico/CodigosEjemplo/Demo_ServicioWindows.zip" target="_blank"&gt;Aquí&lt;/a&gt; 
&lt;p&gt;Salu2&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+%c2%bfC%c3%b3mo+hacer+un+Servicio+Windows+en+C%23%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2774.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2774.entry</guid><pubDate>Thu, 14 Feb 2008 19:24:05 GMT</pubDate><slash:comments>12</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2774/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2774.entry#comment</wfw:comment><dcterms:modified>2008-04-10T14:48:56Z</dcterms:modified></item><item><title>Biztalk Server, ¿Cómo hacer debug y ver los mensajes?</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2710.entry</link><description>&lt;p&gt;BizTalk Server es una excelente herramienta para construir procesos de negocio que requieren de integración de sistemas.  &lt;p&gt;Desde que se tienen IDE’s de desarrollo potentes, los desarrolladores están acostumbrados cada vez más a hacer debug de sus aplicaciones e ir viendo el estado de los objetos en memoria mientras se ejecuta la aplicación. Un problema en el desarrollo de orquestaciones es poder hacer debug de lo que estamos desarrollando. Por eso la pregunta, ¿Cómo hacer debug y ver los mensajes?  &lt;h3&gt;&lt;font color="#baf56b"&gt;Respuesta&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;BizTalk tiene una herramienta llamada &lt;strong&gt;&lt;a title="Más información del HAT" href="http://technet.microsoft.com/en-us/library/ms943738.aspx" target="_blank"&gt;Health and Activity Tracking (HAT)&lt;/a&gt;&lt;/strong&gt; que permite hacer consultas de las actividades que el motor servidor BizTalk está ejecutando.  &lt;p&gt;Con esta herramienta podemos hacer debug de las orquestaciones y ver el contenido de los mensajes de cada instancia de servicio que se están ejecutando.  &lt;p&gt;Los pasos para hacer debug son los que se muestran en el siguiente diagrama.  &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1puTSWQA4qEtcGt53VgEc6GSHvhPJzxI7Pv6hfKDK-sVWtq4ENYl94vWBU9y-_1AIsmm3L7UYq5Z4e-AtyZSEI0Q?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=293 alt="Pasos para hacer Debug" src="http://by1.storage.msn.com/y1pEbp1yuGPmyKliLCyzgSqUs-ABwlxALCXu8OrFijaD3IsH8qFQ44z3yjF0lkOBrYzCAsrjpgr5BvaefZtrySJN0gf-3GJ6qod?PARTNER=WRITER" width=525 border=0&gt;&lt;/a&gt;  &lt;p&gt;El primer paso no es materia de este POST.  &lt;p&gt;  &lt;h3&gt;&lt;font color="#baf56b"&gt;Paso 2: Poner la orquestación en modo debug.&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Para esto debemos utilizar la herramienta HAT. Esta herramienta trae consultas pre definidas con la cual podemos ubicar la orquestación que queremos revisar. Usando la consulta Most Recent 100 Service instance podemos ubicar la orquetsación.  &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1puTSWQA4qEtfHXOxoyYaSi_LBrHtR0TXhe_KmncHkHWWpaEz1joUpSaScUMgTllSjIoYysiJ5-EWaKA_cq7zBJQ?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=290 alt="Consulta en el HAT" src="http://by1.storage.msn.com/y1pEbp1yuGPmyKDNUFLOVoB_RLE1vZ6LAd9h1N3Cx7zyMf9Ym2McoLHiTHTYsNjebQWHaZC66kFmdGAeq34CdvFICYpZXeGyyYY?PARTNER=WRITER" width=524 border=0&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#baf56b"&gt;Figura 1.&lt;/font&gt; &lt;p&gt;Una vez ubicada la orquestación que buscamos, debemos instanciar el &lt;strong&gt;&lt;a title="Más información del Orchestration debugger" href="http://msdn2.microsoft.com/en-us/library/aa953746.aspx" target="_blank"&gt;Orchestration debugger&lt;/a&gt;&lt;/strong&gt; utilizando el botón derecho sobre la orquestación, como lo muestra la figura 2. &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1pAS-CrAYA_yg4Uf_s4HaBCkFx_HRmYvdikx6YAyT_gNiWJdHPu1iVQywQSvA6JEs8NvleVRhrzT9fGAPasgJZzBzlZcQQedHO?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=294 alt=HAT src="http://byfiles.storage.msn.com/y1p4ztv0kRO4DsR4Hbj2iNDsqFpec24HBgRfBfRcG1Iy-4Jhc8eEBss2Ydmw6cqqRlFQ-a7qC_ZDtw?PARTNER=WRITER" width=530 border=0&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#baf56b"&gt;Figura 2.&lt;/font&gt; &lt;p&gt;Por último debemos poner el o los puntos de ruptura en la orquestación para así poder ver su comportamiento en tiempo de ejecución. Esto se hace con el botón derecho sobre la acción, como muestra la figura 3. Luego de esto hay que cerrar el Orchestration Debugger.  &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1puTSWQA4qEtds8piNz7WZ4h0XGNLcEi5--LCMHT6A6qSWTeDQfutO2ylBmG1R5Z5-bHa9HH7tJLufegBXkncv7w?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=294 alt="Orchestrator Debugger" src="http://by1.storage.msn.com/y1pEbp1yuGPmyLdAB689IexD7TpPY6XM5nlnifxc9U8fY6Jq2avHeIfCOxUuJGvZpnhPu3YRTfO47a-Jn6egnAZk-yMX_5CDOfT?PARTNER=WRITER" width=531 border=0&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#baf56b"&gt;Figura 3.&lt;/font&gt;  &lt;h3&gt;&lt;font color="#baf56b"&gt;Paso 3: Ejecutar la orquestación&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Debemos iniciar el proceso de negocio que queremos debugear, esto se hace mandando el mensaje a BizTalk que inicia el proceso.  &lt;p&gt;  &lt;h3&gt;&lt;font color="#baf56b"&gt;Paso 4: Encontrar la instancia de la orquestación &lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Para encontrar la instancia de la orquestación usamos el HAT con una consulta que muestre las orquestaciones que tienen el estado &lt;strong&gt;Strated&lt;/strong&gt;. Cuando pusimos en el paso 2 el punto de ruptura, el motor detiene todas las instancias de esa orquestación en ese punto de ruptura por lo que quedan en estado Started.  &lt;p&gt;Con la siguiente consulta podemos encontrar las instancias.  &lt;p&gt;  &lt;table bordercolor="#baf56b" cellspacing=0 cellpadding=2 width=544 border=1&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=top width=542&gt; &lt;p&gt;SELECT top 100  &lt;p&gt;[Service/Name], [Service/Type],[ServiceInstance/State],  &lt;p&gt;dateadd(minute, @UtcOffsetMin, [ServiceInstance/StartTime]) as [StartTime],  &lt;p&gt;dateadd(minute, @UtcOffsetMin, [ServiceInstance/EndTime]) as [EndTime],  &lt;p&gt;[ServiceInstance/Duration],[ServiceInstance/ExitCode],[ServiceInstance/ErrorInfo],  &lt;p&gt;[ServiceInstance/Host], [Service/AssemblyName], [ServiceInstance/InstanceID],  &lt;p&gt;[ServiceInstance/ActivityID], [Service/ServiceGUID],[Service/ServiceClassGUID]  &lt;p&gt;FROM dbo.dtav_ServiceFacts sf WITH (READPAST)  &lt;p&gt;where  &lt;p&gt;[Service/Type]='Orchestration' and [ServiceInstance/State]='Started'  &lt;p&gt;ORDER BY sf.[ServiceInstance/StartTime] desc&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;font color="#baf56b"&gt;Código 1: Consulta SQL&lt;/font&gt; &lt;p&gt;El resultado de esta consulta son las instancias que están Started en el servidor. &lt;p&gt;  &lt;h3&gt;&lt;font color="#baf56b"&gt;Paso 5: Attach el proceso y ver el mensaje. &lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Para poder tomar la instancia y ver el estado de los mensajes debemos ejecutar la consulta y con el botón derecho sobre la orquestación iniciar el Orchestration Debugger. La figura 4 muestra el resultado de la consulta. &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1pAS-CrAYA_yijHIX3hsRlFsNuzLUF6EfJRcrdqEWTJ7pQ-paTk1IYlyX1gZLqcleATn849JvjyAK5xVN6DdvfTuP_ZZgZFlPj?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=301 alt=HAT src="http://by1.storage.msn.com/y1pEbp1yuGPmyIBqemz3MgjXmA4bu0EzFs4cUALey-R_HrIxQ_8cvTrkv6Qisc4eCxoNp3bYhMbqJD8TUighLqZuIcR9E1UHxL1?PARTNER=WRITER" width=544 border=0&gt;&lt;/a&gt; &lt;p&gt;&lt;font color="#baf56b"&gt;Figura 4.&lt;/font&gt; &lt;p&gt;Ahora en el Orchestration Debugger, debemos hacer Attach del proceso para poder cargar la información de la instancia en el Debugger. La figura 5 muestra cómo hacerlo.  &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1pAS-CrAYA_yiw9RieWw7D5H8tDT3U0mvmhwxYFO5_p5A3gUcklDzb5Hcl8pZi4N3RhmlVdNv5n3iOkwCk9US_HC3FfyMIWRL2?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=306 alt="Orchestartor Debugger" src="http://byfiles.storage.msn.com/y1p4ztv0kRO4DtRXGggMm8pwrgRxIQbByUw0RwmTbxd9LO3Dal9xk2G8vhSkuTqUZw98ZYiHgRGMe0?PARTNER=WRITER" width=553 border=0&gt;&lt;/a&gt;  &lt;p&gt;Figura 5. &lt;p&gt;Ahora tenemos toda la información de la instancia a la vista y podemos por ejemplo ver el valor de un mensaje. Este valor podemos verlo en el cuadro de propiedades de las variables o con el botón derecho sobre el mensaje grabarlo en disco. &lt;p&gt;&lt;a href="http://txrrzg.bay.livefilestore.com/y1puTSWQA4qEtc0C5XyMZUI92aPiN7tXYUnNVzL7blVm0qzic_C2Q17OdJk6WunBiDr62PYg8AnPNOz6HzlptEIDg?PARTNER=WRITER" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=305 alt="Valores de mesajes" src="http://by1.storage.msn.com/y1pEbp1yuGPmyL4J_CfvYG7ryqWqSvCXym4jbqXGLtrnHbdKMYbTfMp-NZV0L-2Gys2rymg2CDPJCrcWD5sDt3sbkeCRkWgUH2l?PARTNER=WRITER" width=551 border=0&gt;&lt;/a&gt; &lt;p&gt;Figura 6. &lt;p&gt;  &lt;h3&gt;&lt;font color="#baf56b"&gt;Paso 6: Sacar del modo Debug la orquestación &lt;/font&gt;&lt;/h3&gt; &lt;p&gt;Es muy importante luego de realizar el debug, sacar los puntos de ruptura de la orquestación, sino está seguirá deteniendo todas las instancias de la misma que se ejecuten. &lt;p&gt;Para esto, en el mismo Orchestration Debugger se deben borrar los puntos de ruptura y luego cerrarlo. Eso es todo!!! &lt;p&gt;Salu2&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+Biztalk+Server%2c+%c2%bfC%c3%b3mo+hacer+debug+y+ver+los+mensajes%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2710.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2710.entry</guid><pubDate>Wed, 06 Feb 2008 19:51:17 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2710/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2710.entry#comment</wfw:comment><dcterms:modified>2008-02-06T19:57:25Z</dcterms:modified></item><item><title>Salud de mi servidor Windows, la salud no es solo para humanos</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2643.entry</link><description>&lt;p&gt;Nuevamente recibo una pregunta interesante, los clientes son una fuente de inspiración inagotable. Qué pena no tener más tiempo para Bloger con más frecuencia. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Problema&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;El equipo de desarrollo he desarrollado una nueva aplicación y requiere saber si está aplicación puede o no ser instalada en un servidor que actualmente aloja otras aplicaciones. ¿Cómo saber si será capaz el servidor de soportar esta nueva aplicación? &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Posible Solución&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;El sentido común dice que midiendo los recursos que actualmente usa el servidor se puede determinar la capacidad “ociosa” disponible para que la nueva aplicación se ejecute. Esto es verdad si y solo sí el uso de recursos fuera lineal. &lt;p&gt;No voy a entrar en la complejidad de lo que es un sistema lineal, pero en términos simples Un sistema lineal es un sistema que obedece las propiedades de escalado (homogeneidad) y de superposición (aditiva), mientras que un sistema no-lineal es cualquier sistema que no obedece al menos una de estas propiedades. &lt;p&gt;Asumiendo que los recursos se administran de manera lineal podemos declarar que los recursos usados hoy en el servidor al poner la nueva aplicación, no variaran sino que seguirán constante. Esto es la propiedad de superposición de los sistemas lineales. Esto no es verdad en el mundo real, pero es un supuesto que permite un análisis simple para obtener resultados aproximados evitando las complejidades de los sistemas no lineales. &lt;p&gt;Ahora, después de haber “forzado” la realidad nos queda medir el uso de recursos. Las mediciones más simples y al alcance de todos en la plataforma Windows se hacen utilizando la herramienta &lt;strong&gt;Performance Monitor&lt;/strong&gt; [1]. &lt;p&gt;Dependiendo del aspecto que se quiera observar son los contadores que debemos utilizar. En el artículo &lt;strong&gt;Key Performance Monitor Counters&lt;/strong&gt; [3] explican que contadores utilizar para responder las siguientes preguntas: &lt;p&gt;  &lt;ul&gt; &lt;li&gt;¿Cuánto es la disponibilidad del servidor? &lt;li&gt;¿Cuán ocupado está el servidor? &lt;li&gt;¿Está funcionando adecuadamente el Hardware? &lt;li&gt;¿Tienes suficiente RAM? [Muy importante] &lt;li&gt;¿El disco es lo suficientemente rápido?&lt;/ul&gt; &lt;p&gt;La gracias de este análisis es que no requiere de un entendimiento profundo de lo que el sistema hace, o como está construido (Java, DotNEt, etc..) Pasa a ser una caja negra. Ahora, para los puristas eso es malo porque no te da razones solo describe comportamiento de el sistema como un todo. &lt;p&gt;Después de medir, se obtiene la capacidad ociosa del servidor de destino. Podemos representar eso como Recursos Disponibles (Rd).  &lt;p&gt;Los recursos que la nueva aplicación utiliza deben ser medidos de la misma manera. Para medir estos recursos debemos en el ambiente de Test “cargar la aplicación” para poder medir así los recursos que utiliza. Representaremos eso como Recursos Nueva Aplicación (Rna).  &lt;p&gt;Entonces, después de “forzar la realidad” podemos decir que: &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;ol&gt; &lt;li&gt; &lt;div style="margin-bottom:0pt;line-height:normal"&gt;Sí &lt;span style=""&gt; &lt;/span&gt;Rd &amp;gt;&amp;gt; Rna =&amp;gt; No tendremos mayores problemas.&lt;/div&gt; &lt;li&gt; &lt;div style="margin-bottom:0pt;line-height:normal"&gt;Sí Rd &amp;gt; Rna =&amp;gt; no podemos decir nada con “responsabilidad”.&lt;/div&gt; &lt;li&gt; &lt;div style="margin-bottom:0pt;line-height:normal"&gt;Sí Rd &amp;lt;= Rna =&amp;gt; No podemos instalar la nueva aplicación en el servidor.&lt;/div&gt;&lt;/ol&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Solo en el primer caso, esta prueba simplificada nos da una respuesta práctica. En los otros casos hay que utilizar técnicas más sofisticadas, las cuales deben ser realizadas por gente con más experticia que un desarrollador de software como yo  :) &lt;p&gt;Un ejemplo del nivel de complejidad de las medidas para los casos no resueltos con este método pragmático se puede ver en este POST [4] específico para medir desempeño de Web Services construidos en ASPNET. &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Referencias&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;1.- &lt;a title="Performance Monitor." href="http://www.windowsnetworking.com/articles_tutorials/Windows_2003_Performance_Monitor.html" target="_blank"&gt;Performance Monitor.&lt;/a&gt; &lt;p&gt;2.- &lt;a title="Sistemas Lineales" href="http://cnx.org/content/m12822/latest/" target="_blank"&gt;Sistemas Lineales&lt;/a&gt;. &lt;p&gt;3.- &lt;a title="Key Performance Monitor Counters" href="http://www.windowsnetworking.com/articles_tutorials/Key-Performance-Monitor-Counters.html?printversion" target="_blank"&gt;Key Performance Monitor Counters&lt;/a&gt;. &lt;p&gt;4.- &lt;a title="Medir el desempeño de Servicios Web plataforma DotNet" href="http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2153.entry" target="_blank"&gt;Medir el desempeño de Servicios Web plataforma DotNet&lt;/a&gt;.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+Salud+de+mi+servidor+Windows%2c+la+salud+no+es+solo+para+humanos&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2643.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2643.entry</guid><pubDate>Thu, 22 Nov 2007 14:43:51 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2643/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2643.entry#comment</wfw:comment><dcterms:modified>2007-11-22T14:43:51Z</dcterms:modified></item><item><title>ASPNET Forms authentication ¿Cómo compartir datos cifrados entre aplicaciones?</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2639.entry</link><description>&lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;&lt;/font&gt;&lt;/strong&gt;  
&lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Escenario&lt;/font&gt;&lt;/strong&gt; 
&lt;p&gt;Para un cliente de la industria Bancaria implementamos autentificación utilizando formularios (Forms authentication) de ASPNET. Este formulario es único para todas las aplicaciones. 
&lt;p&gt;En el contexto de ese proyecto y buscando que sea lo más seguro posible utilizamos las opciones de cifrado de toda la información que se almacena en las cookies. Para ello utilizamos la opción &lt;strong&gt;&amp;lt;forms &lt;font color="#baf56b"&gt;protection&lt;/font&gt;=&amp;quot;All&amp;quot;&amp;gt;&lt;/strong&gt;. 
&lt;p&gt;Ahora, como el formulario es único para todas las aplicaciones, tuvimos que agregar el atributo &lt;strong&gt;&amp;lt;forms &lt;font color="#baf56b"&gt;EnableCrossAppRedirects&lt;/font&gt; =&amp;quot;true&amp;quot;&amp;gt;&lt;/strong&gt; para que así los clientes una vez autentificados regresaran a la aplicación que querían utilizar. 
&lt;p&gt;&lt;font color="#baf56b"&gt;&lt;strong&gt;Solución&lt;/strong&gt;&lt;/font&gt; 
&lt;p&gt;Para que esto funcione, ya que el formulario cifra los datos, es necesario que las aplicaciones y el formulario de autentificación compartan las llaves de cifrado. Esto nos obliga a generar y declarar explícitamente las llaves a utilizar. Esto se hace de la siguiente forma. 
&lt;p&gt;  
&lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt;
&lt;p style="margin-bottom:0pt;line-height:normal"&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;&amp;lt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:#a31515;font-family:'Courier New'"&gt;machineKey&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:red;font-family:'Courier New'"&gt;validationKey&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;=&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&amp;quot;&lt;span style="color:blue"&gt;C50B3C89CB21F4F142.....&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style="color:blue"&gt;5C07F6C36DB51F17C529AD3CABE&lt;/span&gt;&amp;quot;&lt;/span&gt; 
&lt;p style="margin-bottom:0pt;line-height:normal"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:red;font-family:'Courier New'"&gt;decryptionKey&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;=&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&amp;quot;&lt;span style="color:blue"&gt;8A9BE8FD67AF697.....................AF2B72F&lt;/span&gt;&amp;quot;&lt;/span&gt; 
&lt;p style="margin-bottom:0pt;line-height:normal"&gt;&lt;span style="font-size:10pt;color:red;font-family:'Courier New'"&gt;validation&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&amp;quot;&lt;span style="color:blue"&gt;SHA1&lt;/span&gt;&amp;quot;&lt;span style="color:blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;font color="#baf56b"&gt;Tabla1&lt;/font&gt; 
&lt;p&gt;Este TAG se debe agregar en el archivo de configuración tanto en el formulario de autentificación como en las aplicaciones que deben leer las cookies que generó el formulario. 
&lt;p&gt;Un problema común es cómo generar estas llaves. Como generar estas llaves programáticamente pueden verlo en este ejemplo [2] y desarrollar su generador o utilizar este [3] Free directo del WEB. 
&lt;p&gt;Enjoy! 
&lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Referencias&lt;/font&gt;&lt;/strong&gt; 
&lt;p&gt;[1] Cómo: Proteger la autenticación de formularios en ASP.NET 2.0, &lt;a title="Cómo: Proteger la autenticación de formularios en ASP.NET 2.0" href="http://www.microsoft.com/spanish/msdn/articulos/archivo/201205/voices/paght000012.mspx" target="_blank"&gt;http://www.microsoft.com/spanish/msdn/articulos/archivo/201205/voices/paght000012.mspx&lt;/a&gt; 
&lt;p&gt;[2] ASP.NET machineKey Generator, &lt;a title="ASP.NET machineKey Generator" href="http://www.codeproject.com/aspnet/machineKey.asp" target="_blank"&gt;http://www.codeproject.com/aspnet/machineKey.asp&lt;/a&gt; 
&lt;p&gt;[3] ASP.NET machineKey Generator Software, &lt;a title="ASP.NET machineKey Generator Software" href="http://www.developmentnow.com/articles/machinekey_generator.aspx" target="_blank"&gt;http://www.developmentnow.com/articles/machinekey_generator.aspx&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+ASPNET+Forms+authentication+%c2%bfC%c3%b3mo+compartir+datos+cifrados+entre+aplicaciones%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2639.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2639.entry</guid><pubDate>Thu, 15 Nov 2007 15:56:20 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2639/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2639.entry#comment</wfw:comment><dcterms:modified>2008-04-10T16:49:45Z</dcterms:modified></item><item><title>ESB con WCF, ¿cómo puedo implementar Adaptadores?</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2604.entry</link><description>&lt;h2&gt;&lt;font color="#baf56b"&gt;Problema&lt;/font&gt; &lt;/h2&gt; &lt;p&gt;Para un proyecto de plataforma móvil estamos haciendo un ESB pequeño que utiliza WCF. La idea es que este ESB permita agregarle nuevos servicios de manera administrativa sin volver a compilar. Estos servicios son expuestos por otros sistemas y no se puede normar los contratos que estos exponen.  &lt;p&gt;WCF permite llamar servicios a los cuales se le conoce su interfaz mediante el uso de &lt;strong&gt;ChannelFactory&lt;/strong&gt;. Esto serviría pero hay una complicación adicional, no tenemos las interfaces en tiempo de diseño sólo en tiempo de ejecución. En resumen se necesitan en este caso dos cosas:  &lt;ol&gt; &lt;li&gt;Llamar servicios en tiempo de ejecución sin volver a compilar el cliente.  &lt;li&gt;Soportar DataContract en las llamadas a los servicios. &lt;/ol&gt; &lt;p&gt; Este es el concepto de adaptador....... &lt;h2&gt;&lt;font color="#baf56b"&gt;Solución propuesta, Uso de Reflexión &lt;/font&gt;&lt;/h2&gt; &lt;p&gt;Para el primer problema podemos usar reflexión [2]. La reflexión nos permitirá en tiempo de ejecución hacer una instancia del Proxy para el servicio y de los tipos &lt;strong&gt;DataContract &lt;/strong&gt;[3] que este utilice. Esto quiere decir que en tiempo de ejecución cargamos el &lt;strong&gt;Assembly&lt;/strong&gt; [4] que contenga en Proxy y lo invocamos.  &lt;p&gt;Veamos un ejemplo de un servicio simple en WCF. El código uno muestra el contrato del servicio, esto es lo que describe que es lo que el servicio hace. Luego, el código dos muestra los tipos de datos específicos del contrato del servicio. Por último, el código 3 muestra la implementación del servicio.  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;[ServiceContract()]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;span style="color:blue"&gt;interface&lt;/span&gt; IService1&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;[OperationContract]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;string&lt;/span&gt; MyOperation1(&lt;span style="color:blue"&gt;string&lt;/span&gt; myValue);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;[OperationContract]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;string&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt; MyOperation2(DataContract1 dataContractValue);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style=""&gt; &lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 1&lt;/font&gt;:&lt;/strong&gt; Contrato de servicio. &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;[DataContract]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;span style="color:blue"&gt;class&lt;/span&gt; DataContract1&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;string&lt;/span&gt; firstName;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;string&lt;/span&gt; lastName;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;[DataMember]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; FirstName&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; firstName; }&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;set&lt;/span&gt; { firstName = &lt;span style="color:blue"&gt;value&lt;/span&gt;; }&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;[DataMember]&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; LastName&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;get&lt;/span&gt; { &lt;span style="color:blue"&gt;return&lt;/span&gt; lastName; }&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;set&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt; { lastName = &lt;span style="color:blue"&gt;value&lt;/span&gt;; }&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt;&lt;span lang=EN-US style=""&gt;&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 2&lt;/font&gt;:&lt;/strong&gt; Datos del Contrato de servicio.  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;span style="color:blue"&gt;class&lt;/span&gt; service1 : IService1&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; MyOperation1(&lt;span style="color:blue"&gt;string&lt;/span&gt; myValue)&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:#a31515"&gt;&amp;quot;Hello: &amp;quot;&lt;/span&gt; + myValue;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;string&lt;/span&gt; MyOperation2(DataContract1 dataContractValue)&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:#a31515"&gt;&amp;quot;Hello: &amp;quot;&lt;/span&gt; + dataContractValue.FirstName + &lt;span style="color:#a31515"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + dataContractValue.LastName;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 3&lt;/font&gt;:&lt;/strong&gt; Implementación del servicio.  &lt;p&gt;Para que el cliente (ESB) invoque al servicio va a requerir de un Proxy que le permita llamar a los métodos del servicio. Generamos entonces un proxy en un Assembly separado que pueda ser entregado al administrador del ESB para que lo &amp;quot;instale&amp;quot;. La instalación no requerirá de compilación del lado del cliente (ESB).  &lt;p&gt;Una vez que tenemos el Assembly podemos hacer una instancia del Proxy y ejecutar sus métodos. Como ejemplo, primero llamaremos al método &lt;strong&gt;MyOperation1&lt;/strong&gt; del servicio de ejemplo. Para esto construimos un método de llamado en el cliente como se muestra en el código 4.  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; Este método ejecuta el proxy usando reflexion&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;pathAssembly&amp;quot;&amp;gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Ruta del Assembly del Proxy&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;NombreTypoProxy&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Tipo del proxy&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;NombreOperacion&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Nombre del método a Ejecutar&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;mParametros&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;paramtros del método&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; EjecutarProxy(&lt;span style="color:blue"&gt;string&lt;/span&gt; pathAssembly, &lt;span style="color:blue"&gt;string&lt;/span&gt; NombreTypoProxy,&lt;span style="color:blue"&gt;string&lt;/span&gt; NombreOperacion, &lt;span style="color:blue"&gt;object&lt;/span&gt;[] mParametros)&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Console.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;LLamada a través de un Proxy Externo&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:green"&gt;//1.- Levantar el Assembly que contiene el Proxy.&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;Assembly SampleAssembly = Assembly.LoadFile(pathAssembly);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//2.- Hacen una inctancia de la clase Proxy&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;object&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; myClassObj = SampleAssembly.CreateInstance(NombreTypoProxy);&lt;span style="color:green"&gt;// (&amp;quot;ProxyIntermedio.localhost.Service1Client&amp;quot;);&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;// 3.- Obtener la información del tipo del Proxy&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Type myTypeObj = myClassObj.GetType();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:green"&gt;// 4.- Obtener información del método a llamar&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;MethodInfo myMethodInfo = myTypeObj.GetMethod(NombreOperacion);&lt;span style="color:green"&gt;//(&amp;quot;MyOperation1&amp;quot;);&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//5.- llamar al servicio, usando el Proxy&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Console.Write(&lt;span style="color:#a31515"&gt;&amp;quot;\nLLamando a - &amp;quot;&lt;/span&gt; + myTypeObj.FullName + &lt;span style="color:#a31515"&gt;&amp;quot;\n Respuesta: &amp;quot;&lt;/span&gt; +&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;                         &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;myMethodInfo.Invoke(myClassObj, mParametros) + &lt;span style="color:#a31515"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;Console.ReadLine();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 4&lt;/font&gt;:&lt;/strong&gt; llamada a través del proxy externo.  &lt;p&gt;Este ejemplo utiliza un tipo de datos &amp;quot;primitivo&amp;quot; lo cual puede ser muy común pero no necesariamente así es siempre. Para servicios más complejos se usan tipos de datos complejos los cuales se modelan utilizando DataContract. El próximo ejemplo llama al método &lt;strong&gt;MyOperation2&lt;/strong&gt; que usa un argumento del tipo &lt;strong&gt;DataContract1&lt;/strong&gt;.  &lt;p&gt;El código 5 muestra cómo podemos llamar a un servicio que tiene como argumento de entrada un tipo de dato complejo haciendo uso de un Proxy externo. El principio es el mismos que en el caos anterior, con la diferencia que ahora debemos instanciar un &lt;strong&gt;DataContract&lt;/strong&gt; y asignarle los valores que correspondan. Para esto usamos las capacidades de Reflexión para instanciar tipos y asignarle valores a sus propiedades como se muestra en el punto 6 del código 5. El código que llama a este método se muestra en el código 6, ahí se puede ver que el parámetro de entrada al método &lt;span style="font-size:10pt;font-family:courier new"&gt;&lt;strong&gt;EjecutarProxyTypoComplejo&lt;/strong&gt;&lt;/span&gt; es un diccionario [5] con los valores, el cual será recorrido y asignado dentro del método.  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:475pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=633&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; LLamada utilizando un proxy externo con un método de datos complejo&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;pathAssembly&amp;quot;&amp;gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Ruta del Assembly del Proxy&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;NombreTypoProxy&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Tipo del proxy&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;NombreTypoData&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Nombre tipo del DataContract&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;NombreOperacion&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Nombre del método a Ejecutar&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;///&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;param name=&amp;quot;mParametros&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;Diccionario con los valores a asignar al Datacontract&lt;/span&gt;&lt;span style="font-size:10pt;color:gray;font-family:'Courier New'"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; EjecutarProxyTypoComplejo(&lt;span style="color:blue"&gt;string&lt;/span&gt; pathAssembly, &lt;span style="color:blue"&gt;string&lt;/span&gt; NombreTypoProxy,&lt;span style="color:blue"&gt;string&lt;/span&gt; NombreTypoData,&lt;span style="color:blue"&gt;string&lt;/span&gt; NombreOperacion, Dictionary&amp;lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;,&lt;span style="color:blue"&gt;string&lt;/span&gt;&amp;gt;&lt;span style=""&gt;  &lt;/span&gt;mParametros)&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Console.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;\nLLamada a través de un proxy externo con tipo de dato complejo&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//1.- Levanatr Assembly&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Assembly SampleAssembly = Assembly.LoadFile(pathAssembly);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//2.- Crear instancia del Proxy&lt;span style=""&gt;        &lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style="color:blue"&gt;object&lt;/span&gt; myClassProxy = SampleAssembly.CreateInstance(NombreTypoProxy);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:green"&gt;//3.- Crear Instancia del DataContract&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;object&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; myDataContract = SampleAssembly.CreateInstance(NombreTypoData);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//4.- Obtener los tipos de datos&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Type myTypeProxy = myClassProxy.GetType();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Type myTypeData = myDataContract.GetType();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:green"&gt;//5.- Obtener la información del método.&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;MethodInfo myMethodInfo = myTypeProxy.GetMethod(NombreOperacion);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//6.- Asignar los valores al Datacontract1&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;PropertyInfo prop;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;foreach&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt; (KeyValuePair&amp;lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;, &lt;span style="color:blue"&gt;string&lt;/span&gt;&amp;gt; kvp &lt;span style="color:blue"&gt;in&lt;/span&gt; mParametros)&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;{&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;prop = myTypeData.GetProperty(kvp.Key);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;        &lt;/span&gt;prop.SetValue(myDataContract, kvp.Value, &lt;span style="color:blue"&gt;null&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:green"&gt;//7.- Objeto para usar como argumento tipado.&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;color:blue;font-family:'Courier New'"&gt;object&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;[] mParam = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;object&lt;/span&gt;[] { myDataContract };&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//8.- llamar al servicio&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;Console.Write(&lt;span style="color:#a31515"&gt;&amp;quot;\nllamando a&lt;span style=""&gt;  &lt;/span&gt;- &amp;quot;&lt;/span&gt; + myTypeProxy.FullName + &lt;span style="color:#a31515"&gt;&amp;quot; \nRespuesta:&lt;span style=""&gt;  &lt;/span&gt;&amp;quot;&lt;/span&gt; +&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;                         &lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;myMethodInfo.Invoke(myClassProxy, mParam) + &lt;span style="color:#a31515"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;Console.ReadLine();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;}&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 5&lt;/font&gt;:&lt;/strong&gt; llamada a través del proxy externo con un tipo de dato complejo.  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;padding-bottom:0in;border-left:#baf56b 1pt solid;width:580.55pt;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width=774&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//..... algun códiogo aqui&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;Dictionary&amp;lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;,&lt;span style="color:blue"&gt;string&lt;/span&gt;&amp;gt; lala = &lt;span style="color:blue"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:blue"&gt;string&lt;/span&gt;,&lt;span style="color:blue"&gt;string&lt;/span&gt;&amp;gt;();&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span lang=EN-US style="font-size:10pt;font-family:'Courier New'"&gt;lala.Add(&lt;span style="color:#a31515"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;,&lt;span style="color:#a31515"&gt;&amp;quot;Juan Pablo&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;lala.Add(&lt;span style="color:#a31515"&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;,&lt;span style="color:#a31515"&gt;&amp;quot;García González&amp;quot;&lt;/span&gt;);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;EjecutarProxyTypoComplejo(&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:#a31515"&gt;@&amp;quot;..\ProxyIntermedio.dll&amp;quot;&lt;/span&gt;,&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;ProxyIntermedio.localhost.Service1Client&amp;quot;&lt;/span&gt;,&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;ProxyIntermedio.localhost.DataContract1&amp;quot;&lt;/span&gt;,&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;font-family:'Courier New'"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;MyOperation2&amp;quot;&lt;/span&gt;, lala);&lt;/span&gt; &lt;p style="margin-bottom:0pt"&gt;&lt;span style="font-size:10pt;color:green;font-family:'Courier New'"&gt;//.... algun código aquií&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#baf56b"&gt;Código 6&lt;/font&gt;:&lt;/strong&gt; llamada a través del proxy externo con un tipo de dato complejo.  &lt;p&gt;Con esta técnica todos los futuros servicios pueden ser enlazados utilizando el Proxy autogenerado para cada servicio.   &lt;p&gt;  &lt;h2&gt;&lt;font color="#baf56b"&gt;Referencias&lt;/font&gt; &lt;/h2&gt; &lt;p&gt;[1] Adapter pattern, &lt;a title="Adapter Pattern" href="http://en.wikipedia.org/wiki/Adapter_pattern" target="_blank"&gt;http://en.wikipedia.org/wiki/Adapter_pattern&lt;/a&gt;  &lt;p&gt;[2] Información general sobre la reflexión, &lt;a title="Infromación General" href="http://msdn2.microsoft.com/es-es/library/f7ykdhsy(VS.80).aspx" target="_blank"&gt;http://msdn2.microsoft.com/es-es/library/f7ykdhsy(VS.80).aspx&lt;/a&gt;  &lt;p&gt;[3]Contratos de Datos, &lt;a title="WCF, Contratos de datos." href="http://www.microsoft.com/spanish/msdn/articulos/archivo/041206/voices/LearnTheABCsOfP.mspx#E3H" target="_blank"&gt;http://www.microsoft.com/spanish/msdn/articulos/archivo/041206/voices/LearnTheABCsOfP.mspx#E3H&lt;/a&gt;  &lt;p&gt;[4] What is a .Net Assembly? , &lt;a title="¿Qué son los assemblys en dotnet?" href="http://www.programmersheaven.com/2/FAQ-DOTNET-DOTNET-Assembly-Explained" target="_blank"&gt;http://www.programmersheaven.com/2/FAQ-DOTNET-DOTNET-Assembly-Explained&lt;/a&gt;  &lt;p&gt;[5] Dictionary Generic Class, &lt;a title="Diccionarios en Generics" href="http://msdn2.microsoft.com/en-us/library/xfhwa508.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/xfhwa508.aspx&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+ESB+con+WCF%2c+%c2%bfc%c3%b3mo+puedo+implementar+Adaptadores%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2604.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2604.entry</guid><pubDate>Sun, 14 Oct 2007 20:09:32 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2604/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2604.entry#comment</wfw:comment><dcterms:modified>2007-10-14T20:26:24Z</dcterms:modified></item><item><title>¿Qué tópicos se deben incluir en un proyecto de SOA?</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2596.entry</link><description>&lt;p&gt;Cuando se comienza a desarrollar un proyecto de SOA es necesario detenerse a pensar en todos los aspectos a cubrir para que la adopción de este estilo de arquitectura no se convierta en un problema. Comúnmente se piensa que construir servicios es comenzar con una arquitectura orientada a servicios, pero en rigor afirmar esto es como decir que la arquitectura de una casa de hace construyendo ladrillos.  &lt;p&gt;Los temas a incluir en el desarrollo de un proyecto de adopción de SOA que considero fundamentales son los siguientes:  &lt;ol&gt; &lt;li&gt;Cumplir con los principios de la orientación a Servicios.  &lt;li&gt;Diseño de las capas de Servicios.  &lt;li&gt;Definición del ciclo de vida de los Servicios  &lt;li&gt; &lt;div&gt;Definición de los aspectos operacionales &lt;/div&gt; &lt;ol&gt; &lt;li&gt;Soporte de múltiples protocolos estándares.  &lt;li&gt;Despacho garantizado.  &lt;li&gt;Servicios Síncronos y Asíncronos.  &lt;li&gt;Manejo de excepciones.  &lt;li&gt;Seguridad de los Servicios.  &lt;li&gt;Instrumentación.  &lt;li&gt;Contenedor de Servicios &lt;/ol&gt; &lt;li&gt;Caso de prueba. &lt;/ol&gt; &lt;h1&gt;&lt;font color="#baf56b"&gt;Cumplir con los principios de la orientación a Servicios&lt;/font&gt;&lt;/h1&gt; &lt;p&gt;Los principios de la orientación a servicios son la fundamentación de todo el esfuerzo que se realiza en este tipo de proyectos. Por esta razón se deben cumplir en todo momento con estos principios.  &lt;ul&gt; &lt;li&gt;Los servicios son reusables.  &lt;li&gt;Los servicios comparten contratos no código.  &lt;li&gt;Los Servicios tienen bajo acoplamiento.  &lt;li&gt;Los servicios tienen Fronteras explicitas.  &lt;li&gt;Los Servicios son modulares y permiten la composición.  &lt;li&gt;Los Servicios son autónomos.  &lt;li&gt; &lt;div&gt;Los servicios deben permitir métodos de descubrimiento. &lt;/div&gt;&lt;/ul&gt; &lt;h1&gt;&lt;font color="#baf56b"&gt;Diseño de las capas de Servicios&lt;/font&gt;&lt;/h1&gt; &lt;p&gt;En una arquitectura empresarial, es necesario ubicar la capa de servicios entre la capa de negocios y la capa de servicios de aplicación. Lo que se busca lograr con la definición clara de las capas de servicios es poder contestar preguntas fundamentales como:  &lt;ul&gt; &lt;li&gt;¿Qué lógica será representada por los servicios?  &lt;li&gt;¿Cómo se relacionaran estos servicios con la lógica de aplicaciones existentes?  &lt;li&gt;¿Cómo los servicios pueden representa de mejor forma los procesos de negocio?  &lt;li&gt;¿Cómo pueden los servicios ser construidos e instalados para promover la agilidad? &lt;/ul&gt; &lt;p&gt;La siguiente figura muestra una idea de las capas y como se busca definirlas.  &lt;p&gt;&lt;span style="font-size:12pt;font-family:times new roman"&gt;&lt;/span&gt; &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1p4ztv0kRO4DvqNo43I7B9o5R355WWOnp7MOqQfyZVwcYCAKooMENBb2ZZj0fvyBxFHjEaKPz_-yY" target="_blank"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=204 alt=Capas src="http://byfiles.storage.msn.com/y1p4ztv0kRO4Ds0RbsOXtI8Dtn8mOzc6utSH9EEMzyYiEgXa3WOM9bkjxM9-AFs3PtSpUX1SgE81Ts" width=240 border=0&gt;&lt;/a&gt;  &lt;h1&gt;&lt;font color="#baf56b"&gt;Definición del ciclo de vida de los Servicios&lt;/font&gt;&lt;/h1&gt; &lt;p&gt;Para poder asegurar un resultado predecible en los futuros proyectos de software es necesario definir un proceso de análisis de los servicios que se desean construir.  &lt;p&gt;El ciclo de vida del proyecto es un conjunto de pasos necesarios que deben ser cumplidos para construir los servicios necesarios de una arquitectura SOA. Los proyectos de implementación de una arquitectura orientada a servicios (SOA), siguen al igual que todos los proyectos de software un ciclo de vida definido.  &lt;p&gt;Las etapas de este ciclo de vida son:  &lt;ul&gt; &lt;li&gt;Análisis Orientado a Servicios  &lt;li&gt;Diseño Orientado a Servicios  &lt;li&gt;Desarrollo de Servicios  &lt;li&gt;Prueba de Servicios  &lt;li&gt;Instalación de Servicios  &lt;li&gt;Operación de Servicios &lt;/ul&gt; &lt;h1&gt;&lt;font color="#baf56b"&gt;Definición de los aspectos de implementación&lt;/font&gt; &lt;/h1&gt; &lt;p&gt;Este es el primer punto que se ocupa de los aspectos de implementación. Estos temas son importantes para llevar las definiciones conceptuales de alto nivel a definiciones pragmáticas que los equipos de proyectos puedan utilizar. Por supuesto cada definición de estos aspectos debe cumplir con las orientaciones generales definidas con anterioridad.  &lt;p&gt;La lista de aspectos a cubrir son:  &lt;ul&gt; &lt;li&gt;Soporte de múltiples protocolos estándares.  &lt;li&gt;Despacho garantizado.  &lt;li&gt;Servicios Síncronos y Asíncronos.  &lt;li&gt;Manejo de excepciones.  &lt;li&gt;Seguridad de los Servicios.  &lt;li&gt;Instrumentación.  &lt;li&gt;Contenedor de Servicios &lt;/ul&gt; &lt;h1&gt;&lt;font color="#baf56b"&gt;Caso de prueba&lt;/font&gt;&lt;/h1&gt; &lt;p&gt;Como estrategia de validación, necesaria en cualquier proyecto, es necesario realizar un caso de prueba. La idea del caso de prueba es validar que las definiciones hechas son posibles de implementar y útiles para la organización.  &lt;h1&gt;&lt;font color="#baf56b"&gt;Transferencia de Conocimiento&lt;/font&gt; &lt;/h1&gt; &lt;p&gt;Por último, uno de los mayores problemas que se enfrentan las organizaciones que enfrentan proyectos de orientación a servicios es que cuando los consultores se retiran debe hacerse cargo de la arquitectura, operarla y seguir extendiéndola.  &lt;p&gt;Para facilitar estas tareas se debe incluir un plan de transferencia de conocimiento que es más que escribir manuales o hacer una capacitación.  &lt;p&gt;Estas son las recomendaciones para enfrentar un proyecto de inicio de arquitectura SOA. &lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4697793537861464105&amp;page=RSS%3a+%c2%bfQu%c3%a9+t%c3%b3picos+se+deben+incluir+en+un+proyecto+de+SOA%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=liarjo.spaces.live.com&amp;amp;GT1=liarjo"&gt;</description><comments>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2596.entry#comment</comments><guid isPermaLink="true">http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2596.entry</guid><pubDate>Fri, 12 Oct 2007 21:36:56 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://liarjo.spaces.live.com/blog/cns!4131EA552C5BB029!2596/comments/feed.rss</wfw:commentRss><wfw:comment>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2596.entry#comment</wfw:comment><dcterms:modified>2007-10-12T21:42:47Z</dcterms:modified></item><item><title>Las habilidades de un Jefe de proyectos</title><link>http://liarjo.spaces.live.com/Blog/cns!4131EA552C5BB029!2576.entry</link><description>&lt;p&gt;En mi trabajo estamos buscando un jefe de proyectos, por lo que tuvimos que redactar alguna descripción del perfil de este Rol. En ese trabajo me mandaron la siguiente tabla de habilidades que debería tener un jefe de proyecto.  &lt;p&gt;Me pareció muy completa y precisa por lo que la comparto en este POST. No tengo clara la fuente, por eso no la cito.  &lt;p&gt;El Project Manager por el alcance de sus funciones, del equipo y recursos que administra, y por las variables y escenarios que se presentan, debería tener en mayor o menor grado algunas de las siguientes habilidades:  &lt;p&gt;  &lt;table style="border-right:medium none;border-top:medium none;border-left:medium none;width:97.94%;border-bottom:medium none;border-collapse:collapse" cellspacing=0 cellpadding=0 width="97%" border=1&gt; &lt;tbody&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:#baf56b 1pt solid;width:27.06%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="27%"&gt; &lt;p style="line-height:normal;text-align:center" align=center&gt;&lt;span style="color:white;font-family:'Times New Roman','serif'"&gt;Skill&lt;/span&gt;&lt;span style="font-size:12pt;color:white;font-family:'Times New Roman','serif'"&gt;&lt;/span&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:#baf56b 1pt solid;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:medium none;width:72.94%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="72%"&gt; &lt;p style="line-height:normal;text-align:center" align=center&gt;&lt;span style="color:white;font-family:'Times New Roman','serif'"&gt;Breve descripción&lt;/span&gt;&lt;span style="font-size:12pt;color:white;font-family:'Times New Roman','serif'"&gt;&lt;/span&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:#baf56b 1pt solid;width:27.06%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="27%"&gt; &lt;p style="line-height:normal"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Coping&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:gray;padding-bottom:0in;border-left:medium none;width:72.94%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="72%"&gt; &lt;p style="line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Capacidad de tener una actitud madura ante conflictos y al resolver problemas.&lt;/span&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:#baf56b 1pt solid;width:27.06%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="27%"&gt; &lt;p style="line-height:normal"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Tolerance of ambiguity &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:silver;padding-bottom:0in;border-left:medium none;width:72.94%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="72%"&gt; &lt;p style="line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Capacidad de tomar decisiones sin tener suficiente información. Usualmente son&lt;br&gt;situaciones de incertidumbre.&lt;/span&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:#baf56b 1pt solid;width:27.06%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="27%"&gt; &lt;p style="line-height:normal"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Decisiveness&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;&lt;/span&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:gray;padding-bottom:0in;border-left:medium none;width:72.94%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="72%"&gt; &lt;p style="line-height:normal"&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','sans-serif'"&gt;Capacidad para tomar decisiones y aceptar compromisos. Los compromisos siempre son&lt;br&gt;asumidos.&lt;/span&gt; &lt;tr style=""&gt; &lt;td style="border-right:#baf56b 1pt solid;padding-right:5.4pt;border-top:medium none;padding-left:5.4pt;background:black;padding-bottom:0in;border-left:#baf56b 1pt solid;width:27.06%;padding-top:0in;border-bottom:#baf56b 1pt solid" valign=top width="27%"&gt; &lt;p style="line-height:normal"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size:8.5pt;color:white;font-family:'Verdana','s