<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>No hay lugar como 127.0.0.1</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/cmarin/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/cmarin/feed.xml</link>
    <description>Utilizando el poder de Internet Information Services (IIS), un blog post a la vez...</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:47:32 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Modo clásico y modo integrado</title>
      <link>https://docs.microsoft.com/archive/blogs/cmarin/modo-clsico-y-modo-integrado</link>
      <pubDate>Thu, 15 Jan 2015 13:31:00 GMT</pubDate>
      <dc:creator><![CDATA[c4rlosmarin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cmarin/2015/01/15/modo-clsico-y-modo-integrado/</guid>
      <description><![CDATA[El d&iacute;a de hoy revisaremos la diferencia entre el flujo de peticiones de IIS 6 y el flujo de...]]></description>
      <content:encoded><![CDATA[<p>El d&iacute;a de hoy revisaremos la diferencia entre el flujo de peticiones de IIS 6 y el flujo de peticiones en IIS 7.X/8.X y la forma en que IIS maneja su extensibilidad.</p>
<p><strong>Classic Mode</strong></p>
<p>En primer lugar tenemos el &ldquo;IIS Core&rdquo; que representa el mismo pipeline que se ejecuta cada vez que llega una petici&oacute;n. Ahora bien, existen dos escenarios distintos que analizar, cuando se hace una petici&oacute;n de contenido est&aacute;tico y cuando se hace una petici&oacute;n de contenido din&aacute;mico:</p>
<p>Cuando se realiza una petici&oacute;n de contenido est&aacute;tico, la petici&oacute;n pasa a trav&eacute;s de las notificaciones de filtros ISAPI y a trav&eacute;s de las etapas de autenticaci&oacute;n, compresi&oacute;n, errores personalizados y registro de eventos hasta llegar a la etapa de determinaci&oacute;n de handler. En este momento la petici&oacute;n pasa al handler de contenido est&aacute;tico y una vez que el mismo es servido, la respuesta viaja a trav&eacute;s del pipeline pasando por HTTP.sys y de vuelta al cliente.</p>
<p>En el caso de las peticiones de contenido din&aacute;mico, la petici&oacute;n pasa a trav&eacute;s de las etapas originales y una vez que llega a la etapa de determinaci&oacute;n de handler, es entregada al ISAPI handler. En este punto la petici&oacute;n pasar&iacute;a por un subset de etapas (mapa URL, autenticaci&oacute;n, autorizaci&oacute;n, etc) propias del<br />filtro ISAPI (en este case ASP.NET) y luego ser&iacute;a enviada de vuelta por el pipeline original, pansado a trav&eacute;s de HTTP.sys y al cliente.</p>
<table border="0" align="center">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/93/4810.Classic%20Mode.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-93/4810.Classic-Mode.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/93/4810.Classic%20Mode.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-93/4810.Classic-Mode.png" alt="" border="0" /></a>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;Figura 1. Flujo de peticiones en modo cl&aacute;sico</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Debido entre otras cosas a que las peticiones din&aacute;micas pasaban por el filtro ISAPI y a trav&eacute;s de etapas que ya exist&iacute;an en el pipeline original, se propuso entonces combinar estos dos pipelines para tener un pipeline &uacute;nico donde cualquier componente pudiese suscribirse a cualquier etapa, haciendo todo el proceso mucho m&aacute;s eficiente&hellip;</p>
<p>&nbsp;</p>
<p><strong>Integrated Mode</strong></p>
<p>Desde IIS 7 en adelante, Microsoft introdujo el modo integrado. A partir de este momento aparecen los managed modules conectados a un &uacute;nico pipeline, los cuales soportan todas las operaciones generalmente disponibles para los componentes nativos. Esto quiere decir que as&iacute; como a trav&eacute;s de los native modules se puede realizar autenticaci&oacute;n b&aacute;sica o autenticaci&oacute;n windows, los managed modules tambi&eacute;n pueden realizar autorizaci&oacute;n URL, administraci&oacute;n de roles y autenticaci&oacute;n de formularios (ASP.NET) no s&oacute;lo contra contenido din&aacute;mico, sino tambi&eacute;n contra contenido est&aacute;tico.</p>
<table border="0" align="center">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/93/8233.Integrated%20Mode.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-93/8233.Integrated-Mode.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/66/93/8233.Integrated%20Mode.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-66-93/8233.Integrated-Mode.png" alt="" border="0" /></a></td>
</tr>
<tr>
<td>&nbsp;Figura 2. Flujo de peticiones en modo integrado</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Tambi&eacute;n desde este momento, se hace mucho m&aacute;s facil extender las funcionalidades de IIS ya que podemos desarrollar native modules a trav&eacute;s de la nueva API. De igual forma, podemos desarrollar managed m&oacute;dules a trav&eacute;s de c&oacute;digo .NET (C#) y de la interfaz IHttpModule.</p>
<p>Espero les sea &uacute;til esta informaci&oacute;n, en los pr&oacute;ximos post estaremos viendo c&oacute;mo se traduce esto a un nivel pr&aacute;ctico.</p>
<p>&nbsp;</p>
<p><strong>Referencias</strong></p>
<p>Introduction to IIS Architectures<br /><a title="https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture" href="https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture" target="_blank">https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture</a></p>
<p>ASP.NET Integration with IIS 7<br /><a title="https://www.iis.net/learn/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis" href="https://www.iis.net/learn/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis" target="_blank">https://www.iis.net/learn/application-frameworks/building-and-running-aspnet-applications/aspnet-integration-with-iis</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Arquitectura de IIS 7</title>
      <link>https://docs.microsoft.com/archive/blogs/cmarin/arquitectura-de-iis-7</link>
      <pubDate>Fri, 10 Oct 2014 10:24:00 GMT</pubDate>
      <dc:creator><![CDATA[c4rlosmarin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cmarin/2014/10/10/arquitectura-de-iis-7/</guid>
      <description><![CDATA[Hoy revisaremos la arquitectura de IIS 7 y sus diferencias con la versión anterior de IIS. Si no lo...]]></description>
      <content:encoded><![CDATA[Hoy revisaremos la arquitectura de IIS 7 y sus diferencias con la versión anterior de IIS. Si no lo han hecho aún, les recomiendo echarle un ojo al post anterior sobre la <a title="arquitectura de IIS 6" href="https://blogs.msdn.com/b/cmarin/archive/2014/09/30/arquitectura-de-iis-6.aspx" target="_blank">arquitectura de IIS 6</a>.

La base en la distribución de componentes en IIS 7 se mantiene en comparación con la de IIS 6. Los componentes de IIS están divididos en dos grandes grupos: un grupo de componentes que se encuentra en el modo Kernel y un grupo de componentes que están incorporados en procesos de modo usuario.

Como es de esperar, algunos cambios importantes han tenido lugar tal como se muestra a continuación (No te desesperéis, acá te explicaré el por qué de estos cambios y cómo llegamos a la versión final de la arquitectura implementada en IIS 7.X, la cual se mantiene para IIS 8.X.):

&nbsp;

&nbsp;
<table border="0">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/2014/10/IIS-7-Architecture.png"><img class="alignnone size-full wp-image-105" src="https://msdnshared.blob.core.windows.net/media/2014/10/IIS-7-Architecture.png" alt="IIS 7 Architecture" width="850" height="562" /></a></td>
</tr>
<tr>
<td> Figura 1. Cambios en el diagrama de arquitectura de IIS 7</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

<strong>Componentes en modo Kernel</strong>

La distribución de componentes en modo Kernel muestra ahora dos componentes adicionales, SSL y Windows Authentication. La razón de esto es la de disminuir el impacto en performance por la gran cantidad de context switches entre HTTP.sys y lsass.exe durante la ejecución de tareas de decodificación y autenticación windows. El resultado es que ahora HTTP.sys realiza decodificación SSL y que el Windows Authentication puede manejarse a través del cache de HTTP.sys.

Aparte de lo mencionado anteriormente, no mucho ha cambiado a nivel de HTTP.sys. Otro par de características que podemos mencionar son la inclusión de contadores de desempeño (performance counters) propios de HTTP.sys, así como integración con el comando NetSh.

&nbsp;

<strong>Componentes en modo Usuario</strong>

Lo primero que se debe mencionar a nivel de componentes en modo usuario es el hecho de que FTP Service y NNTP Service ya no están alojados en el proceso inetinfo.exe. FTP Service vive ahora en el proceso llamado svchost.exe y NNTP Service ya no es soportado en IIS 7.X/8.X.

El componente Application Host Helper Service (AppHostSvc) se encarga de realizar tareas de respaldo de la configuración de IIS presente en el archivo ApplicationHost.config.

El componente W3ADM fue reemplazado por Windows Process Activation Service (WAS). Este nuevo servicio es el responsable de iniciar y manejar los worker process así como de reciclarlos de forma reactiva. Adicionalmente, a través de WAS es posible trabajar con peticiones utilizando protocolos distintos a HTTP, entonces, a pesar que IIS cumple con el rol de servidor web, WAS nos permite no estar atados al protocolo HTTP.

inetinfo.exe continúa existiendo, más que todo para soportar compatibilidad con aplicaciones legacy. En lugar de la metabase, ahora existe un emulador de la metabase que se parece y se comunica tal como la hacía la metabase original, sólo que en su lugar lo que hace es traducir información para el nuevo modelo de configuración de IIS presente en el archivo ApplicationHost.config.

lsass.exe aún es utilizado para decodificación SSL y Windows Authentication, con el agregado de que una parte importante de su implementación reside en HTTP.sys como mencionamos previamente.

Del lado de los worker process, ahora vemos que tenemos los managed modules y native modules. Los managed modules son componentes .NET que pueden acoplarse al modo integrado de pipeline. No sudéis que más adelante hablaremos de los pipelines.  ;-)

Los native modules son componentes desarrollados en C++ y que pueden acoplarse a los worker process. De hecho, esta es la forma como se han desarrollado los componentes nativos desde IIS 6 hasta IIS 8, a través de las native APIs. Esto facilita también todo lo relacionado con soporte de aplicaciones legacy.

Según la nueva distribución de componentes en la arquitectura, la versión final implementada desde IIS 7 es como se muestra a continuación:

&nbsp;

&nbsp;
<table border="0">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/2014/10/IIS-7-Architecture-Final.png"><img class="alignnone size-full wp-image-116" src="https://msdnshared.blob.core.windows.net/media/2014/10/IIS-7-Architecture-Final.png" alt="IIS 7 Architecture Final" width="850" height="517" /></a></td>
</tr>
<tr>
<td>Figura 2. Diagrama de arquitectura de IIS 7</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

Nota: los nuevos servicios AppHostSvc, FTP Service y WAS son alojados por svchost.exe, por distintas instancias de svchost.exe.

&nbsp;

<strong>Flujo de trabajo e interacción entre componentes</strong>

Cuando se inicia un servidor que corre IIS, el servicio WAS lee la información del archivo de configuración ApplicationHost.config y crea el setup para HTTP.sys de manera similar como sucedía con WWW Service al iniciar la tabla de enrutamiento.

Al igual como sucede en IIS 6, HTTP.sys valida la petición que recibe:
<ul>
	<li>Si la petición es inválida: se envía el error HTTP correspondiente al cliente.</li>
	<li>Si la petición es válida, HTTP.sys verifica la posibilidad de dar respuesta a la petición desde su cache.
<ul>
	<li>Si la respuesta existe en el cache, HTTP.sys la envía inmediatamente</li>
	<li>De lo contrario, HTTP.sys coloca la petición en la cola de peticiones específica para el application pool correspondiente según la tabla de enrutamiento.</li>
</ul>
</li>
</ul>
Seguidamente HTTP.sys pregunta si existe un worker process que pueda procesar la petición:
<ul>
	<li>Si existe uno o más worker process ejecutándose y escuchando la cola de peticiones, el worker process toma la petición directamente de la cola, la procesa y posteriormente envía la respuesta a HTTP.sys y al cliente.</li>
	<li>De no ser así, HTTP.sys le notifica a WWW Service que se necesita un worker process. A su vez, WWW Service le pide a WAS que inicie y configure un worker process basado en la información alojada en el archivo ApplicationHost.config.</li>
</ul>
Nota: En el caso de IIS 7.5+, existe un módulo adicional que nos ayuda a mejorar el nivel de respuesta de nuestros sitios web cargando las aplicaciones web antes de que la primera petición llegue al servidor. El módulo fue llamado Application Initialization y el mismo forma parte de una instalación en forma de extensión de IIS 7.5 (la cual debe ser descargada posterior a la instalación de IIS), aunque ya en IIS 8 forma parte de las opciones de instalación propias del producto incorporadas en el sistema operativo.

Todo esto está muy bien, pero cómo se ve esto en la práctica?

Pues para verlo, se puede ejecutar la herramienta de consola <a title="tasklist" href="https://technet.microsoft.com/en-us/library/bb491010.aspx" target="_blank">tasklist</a> utilizando el parámetro svc para que nos muestre las distintas instancias de procesos y los procesos que alojan:
<table border="0" align="center">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/2014/10/PowerShell-2.png"><img class="alignnone size-full wp-image-136" src="https://msdnshared.blob.core.windows.net/media/2014/10/PowerShell-2.png" alt="PowerShell" width="850" height="809" /></a></td>
</tr>
<tr>
<td>Figura 3. Ejecución de comando tasklist</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

Esto es todo por hoy, espero les sea útil la información. Hasta la próxima.  :-)

&nbsp;

<strong>Referencias</strong>

Introduction to IIS 7 Architecture
<a href="https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture">https://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture</a>

Application Initialization Module for IIS 7.5
<a href="https://www.iis.net/downloads/microsoft/application-initialization">https://www.iis.net/downloads/microsoft/application-initialization</a>

IIS 8.0 Application Initialization
<a href="https://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization">https://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-application-initialization</a>]]></content:encoded>
    </item>
    <item>
      <title>Arquitectura de IIS 6</title>
      <link>https://docs.microsoft.com/archive/blogs/cmarin/arquitectura-de-iis-6</link>
      <pubDate>Tue, 30 Sep 2014 17:05:00 GMT</pubDate>
      <dc:creator><![CDATA[c4rlosmarin]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/cmarin/2014/09/30/arquitectura-de-iis-6/</guid>
      <description><![CDATA[Siempre es bueno recordar el lugar de donde venimos, es por esto que invertiremos un poco de tiempo...]]></description>
      <content:encoded><![CDATA[Siempre es bueno recordar el lugar de donde venimos, es por esto que invertiremos un poco de tiempo en recordar cómo eran las cosas allá por IIS 6 e iremos avanzando desde allí hasta cubrir los aspectos más importantes de IIS 7.x/8.x. Comencemos…

Los componentes de IIS están divididos en dos grandes grupos: un grupo de componentes que se encuentra en el modo Kernel, es decir, los componentes que vienen incorporados con el sistema operativo Windows; y un grupo de componentes que están incorporados como parte de procesos en modo usuario.
<div>

&nbsp;

&nbsp;
<table border="0">
<tbody>
<tr>
<td><a href="https://msdnshared.blob.core.windows.net/media/2014/09/IIS-6-Architecture.png"><img class="alignnone size-full wp-image-125" src="https://msdnshared.blob.core.windows.net/media/2014/09/IIS-6-Architecture.png" alt="IIS 6 Architecture" width="850" height="519" /></a></td>
</tr>
<tr>
<td> Figura 1. Diagrama de arquitectura de IIS 6</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

<strong>Componentes en modo Kernel</strong>

Los componentes en modo Kernel están ubicados por encima de la capa del protocolo TCP/IP y se comunican directamente con el driver TCPIP.sys. En ese sentido, existe un driver llamado HTTP.sys, éste último viene siendo el driver HTTP para IIS. El propósito de este driver no es más que el de escuchar todo el tráfico HTTP a través del HTTP Listener, interpretarlo y asegurarse de que este tráfico es válido. Una vez que se ha verificado la validez del tráfico, HTTP.sys coloca las peticiones en el request queue correspondiente para que un worker process la tome para su procesamiento.

&nbsp;

<strong>Componentes en modo Usuario</strong>

Uno de los componentes de modo usuario presente en la arquitectura es inetinfo.exe. Dentro de este proceso se ejecutan los servicios SMTP, FTP, NMTP y el Servicio de Administración de IIS, cuyo propósito es administrar y cargar la metabase de IIS en memoria.

<em>Nota: La metabase es un archivo de configuración de IIS y el mismo describe en formato XML todos los sitios web y los application pools que hayan sido configurados en el servidor.</em>

Los application pools, son una agrupación de URLs enrutadas a uno o más worker process. A su vez, el worker process es el proceso de Windows responsable de procesar las peticiones web, es decir, de tomar una petición web, procesarla y generar una salida como respuesta. Además, el worker process se identifica con el nombre w3wp.exe, si, el famoso w3wp.exe...  ;-)

También podemos contar con los web gardens, que no son más que un application pool que utiliza más de un worker process en un sólo servidor. No te preocupéis, de esto hablaremos más adelante.

Seguidamente tenemos el proceso svchost.exe, encargado de alojar los servicios W3ADM y WWW Service (World Wide Web Publishing Service). Para que la comunicación entre HTTP.sys y los componentes W3ADM y WWW Service funcione correctamente, estos últimos deben configurar HTTP.sys para que esté en la capacidad de notificar a estos servicios al momento de necesitar un worker process para procesar una petición.

Por otro lado, sólo mencionar que el componente lsass.exe es utilizado para realizar autenticación Windows y operaciones de decodificación a través de SSL.

&nbsp;

<strong>Flujo de trabajo e interacción entre componentes</strong>

Cuando se inicia un servidor que corre IIS, el servicio IIS Admin Service lee la información del archivo Metabase.xml y crea su representación en memoria. El servicio WWW Service lee esta información e inicializa la tabla de enrutamiento de HTTP.sys con una entrada para cada application pool. HTTP.sys utilizará esta tabla de enrutamiento para determinar qué application pool corresponde a las peticiones entrantes.

Cuando HTTP.sys recibe una petición, la validez de la misma es verificada. En este punto pueden darse los siguientes escenarios:
<ul>
	<li>La petición es inválida: HTTP.sys envía el error HTTP correspondiente al cliente.</li>
	<li>Si la petición es válida: HTTP.sys verifica la posibilidad de dar respuesta a la petición desde su cache.
<ul>
	<li>Si la respuesta existe en el cache, HTTP.sys la envía inmediatamente</li>
	<li>De lo contrario, HTTP.sys coloca la petición en la cola de peticiones específica para el application pool correspondiente según la tabla de enrutamiento.</li>
</ul>
</li>
</ul>
Luego de este punto, HTTP.sys valida si existe un worker process que pueda procesar la petición, dando lugar a su vez a un par se escenarios adicionales:
<ul>
	<li>De no existir un worker process para procesar la petición, HTTP.sys notifica a W3ADM para que éste inicie y configure un worker process basado en la información alojada en memoria según lo encontrado en el archivo de la metabase.</li>
	<li>Si existe uno o más worker process ejecutándose y escuchando la cola de peticiones correspondiente, el worker process toma la petición de la cola, la procesa y posteriormente envía la respuesta a HTTP.sys y al cliente.</li>
</ul>
&nbsp;

Esto es todo por hoy, espero les sea útil la información. Próximamente estaremos revisando la forma en que ésta arquitectura se diferencia de la arquitectura de IIS7.x/8.x.

&nbsp;

<strong>Referencias</strong>

II 6.0 Architecture
<a href="https://technet.microsoft.com/en-us/library/cc739802(v=ws.10).aspx">https://technet.microsoft.com/en-us/library/cc739802(v=ws.10).aspx</a>

IIS 6.0 Services
<a href="https://technet.microsoft.com/en-us/library/cc758949(v=ws.10).aspx">https://technet.microsoft.com/en-us/library/cc758949(v=ws.10).aspx</a>

IIS Service Startup
<a href="https://technet.microsoft.com/en-us/library/cc738440(v=ws.10).aspx">https://technet.microsoft.com/en-us/library/cc738440(v=ws.10).aspx</a>

</div>]]></content:encoded>
    </item>
  </channel>
</rss>