Implementación web de ASP.NET mediante Visual Studio: Transformaciones de archivo Web.config

Por Tom Dykstra

Descarga del proyecto de inicio

En esta serie de tutoriales se muestra cómo implementar (publicar) una aplicación web ASP.NET en Azure App Service Web Apps o en un proveedor de hospedaje de terceros, mediante Visual Studio 2012 o Visual Studio 2010. Para obtener información sobre la serie de tutoriales, vea el primer tutorial de la serie.

Información general

En este tutorial se muestra cómo automatizar el proceso de cambio del archivo Web.config al implementarlo en diferentes entornos de destino. La mayoría de las aplicaciones tienen valores en el archivo Web.config que deben ser diferentes cuando se implementa la aplicación. La automatización del proceso de realización de estos cambios le evita tener que hacerlos manualmente en cada implementación, lo que sería tedioso y propenso a errores.

Aviso: Si recibe un mensaje de error o algo no funciona mientras recorre el tutorial, asegúrese de comprobar la página de solución de problemas.

Diferencias entre transformaciones de Web.config y parámetros de Web Deploy

Hay dos maneras de automatizar el proceso de cambiar los valores del archivo Web.config: transformaciones Web.configy parámetros de Web Deploy. Un archivo de transformación de Web.config contiene marcado XML que especifica cómo cambiar el archivo Web.config cuando se implementa. Puede especificar diferentes cambios para configuraciones de compilación perfiles de publicación específicos. Las configuraciones de compilación predeterminadas son Depuración y Versión, y puede crear configuraciones de compilación personalizadas. Normalmente, un perfil de publicación se corresponde a un entorno de destino. (Obtendrá más información sobre los perfiles de publicación en el tutorial Implementación en IIS como un entorno de prueba).

Los parámetros de Web Deploy se pueden usar para especificar muchos tipos diferentes de valores que se deben configurar durante la implementación, incluidos los que se encuentran en los archivosWeb.config. Cuando se usan para especificar cambios en el archivo Web.config, los parámetros de Web Deploy son más complejos de configurar, pero son útiles cuando no se sabe el valor que se va a establecer hasta que se implemente. Por ejemplo, en un entorno empresarial, es posible que cree un paquete de implementación y se lo asigne a una persona del departamento de TI para que lo instale en producción, y que esa persona tenga que escribir cadenas de conexión o contraseñas que no conoce.

Para el escenario que se describe en esta serie de tutoriales, sabe de antemano todo lo que se debe hacer en el archivo Web.config, por lo que no es necesario usar parámetros de Web Deploy. Configurará algunas transformaciones que difieren en función de la configuración de compilación usada y otras en función del perfil de publicación.

Especificación de valores de Web.config en Azure

Si los valores del archivo Web.config que quiere cambiar están en <connectionStrings> o en el elemento <appSettings>, y si va a implementar en Web Apps en Azure App Service, tiene otra opción para automatizar los cambios durante la implementación. Puede especificar los valores que quiere que surtan efecto en Azure en la pestaña Configurar de la página del portal de administración de la aplicación web (desplácese hacia abajo hasta las secciones configuración de la aplicación y cadenas de conexión). Al implementar el proyecto, Azure aplica automáticamente los cambios. Para más información, vea Sitios web de Windows Azure: funcionamiento de cadenas de aplicación y cadenas de conexión.

Archivos de transformación predeterminados

En el Explorador de soluciones, expanda Web.config para ver los archivos de transformación Web.Debug.config y Web.Release.config que se crean de forma predeterminada para las dos configuraciones de compilación predeterminadas.

Web.config_transform_files

Para crear archivos de transformación para configuraciones de compilación personalizadas, haga clic con el botón derecho en el archivo Web.config y elija Agregar transformaciones de configuración en el menú contextual. En este tutorial no es necesario hacerlo y la opción de menú está deshabilitada, ya que no ha creado ninguna configuración de compilación personalizada.

Más adelante creará tres archivos de transformación más, uno para los perfiles de publicación de prueba, almacenamiento provisional y producción. Un ejemplo típico de un valor que podría controlar en un archivo de transformación de perfil de publicación porque depende del entorno de destino es un punto de conexión WCF diferente para pruebas y producción. Creará archivos de transformación de perfil de publicación en tutoriales posteriores después de crear sus correspondientes perfiles de publicación.

Deshabilitación del modo de depuración

Un ejemplo de un valor que depende de la configuración de compilación en lugar del entorno de destino es el atributo debug. Para una compilación de versión, normalmente querrá deshabilitar la depuración independientemente del entorno en el que se va a realizar la implementación. Por tanto, de manera predeterminada, las plantillas de proyecto de Visual Studio crean archivos de transformación Web.Release.config con código que quita el atributo debug del elemento compilation. Este es el archivo Web.Release.config predeterminado: además de código de transformación de ejemplo comentado, incluye código en el elemento compilation que quita el atributo debug:

<?xml version="1.0" encoding="utf-8"?>

<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

El atributo xdt:Transform="RemoveAttributes(debug)" especifica que quiere que el atributo debug se quite del elemento system.web/compilation en el archivo Web.config implementado. Esto se hará cada vez que implemente una compilación de versión.

Limitación del acceso al registro de errores a los administradores

Si se produce un error mientras se ejecuta la aplicación, seta muestra una página de error genérica en lugar de la página de error generada por el sistema y usa el paquete NuGet Elmah para el registro de errores y los informes. El elemento customErrors del archivo Web.config de la aplicación especifica la página de error:

<customErrors mode="RemoteOnly" defaultRedirect="~/GenericErrorPage.aspx">
  <error statusCode="404" redirect="~/GenericErrorPage.aspx" />
</customErrors>

Para ver la página de error, cambie temporalmente el atributo mode del elemento customErrors de "RemoteOnly" a "Activado" y ejecute la aplicación desde Visual Studio. Provoque un error mediante la solicitud de una dirección URL no válida, como Studentsxxx.aspx. En lugar de una página de error "No se encuentra el recurso" generada por IIS, verá la página GenericErrorPage.aspx.

Error page

Para ver el registro de errores, reemplace todo lo que aparece en la dirección URL después del número de puerto por elmah.axd (por ejemplo, http://localhost:51130/elmah.axd) y presione Entrar:

ELMAH page

No olvide volver a establecer el elemento customErrors en el modo "RemoteOnly" cuando haya terminado.

En el equipo de desarrollo, es conveniente permitir el acceso libre a la página del registro de errores, pero en producción sería un riesgo de seguridad. Para el sitio de producción, quiere agregar una regla de autorización que restrinja el acceso al registro de errores a los administradores y asegurarse de que la restricción funciona también en pruebas y almacenamiento provisional. Por tanto, es otro cambio que quiere implementar cada vez que implemente una compilación de versión, por lo que pertenece al archivo Web.Release.config.

Abra Web.Release.config y agregue un nuevo elemento location inmediatamente antes de la etiqueta de cierre configuration, como se muestra aquí.

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
  <location path="elmah.axd" xdt:Transform="Insert">
    <system.web>
      <authorization>
        <allow roles="Administrator" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>
</configuration>

El valor de atributo Transform de "Insert" hace que este elemento location se agregue como un elemento relacionado con cualquier elemento location existente en el archivo Web.config. (Ya hay un elemento location que especifica reglas de autorización para la página Actualizar créditos).

Ahora puede obtener una vista previa de la transformación para asegurarse de que la ha codificado correctamente.

En el Explorador de soluciones, haga clic con el botón derecho en Web.Release.config y haga clic en Vista previa de la transformación.

Preview Transform menu

Se abre una página en la que se muestra el archivo Web.config de desarrollo a la izquierda y el aspecto que tendrá el archivo Web.configimplementado a la derecha, con los cambios resaltados.

Preview of debug transform

Screenshot showing the Web.config Preview with the development file on the left and what the deployed file will look like on the right with the changes highlighted.

(En la vista previa, es posible que observe algunos cambios adicionales para los que no ha escrito transformaciones: normalmente implican la eliminación de espacios en blanco que no afectan a la funcionalidad).

Al probar el sitio después de la implementación, también lo probará para comprobar que la regla de autorización es efectiva.

Nota:

Nota de seguridad No muestre nunca los detalles del error al público en una aplicación de producción, ni almacene esa información en una ubicación pública. Los atacantes pueden usar la información de error para detectar vulnerabilidades en un sitio. Si usa ELMAH en una aplicación propia, configure ELMAH para minimizar los riesgos de seguridad. El ejemplo de ELMAH de este tutorial no se debe considerar una configuración recomendada. Se trata de un ejemplo elegido para ilustrar cómo controlar una carpeta en la que la aplicación debe poder crear archivos. Para más información, vea Protección del punto de conexión ELMAH.

Valor que controlará en los archivos de transformación de perfil de publicación

Un escenario común es tener los valores del archivo Web.config diferentes para cada entorno en el que se implemente. Por ejemplo, una aplicación que llama a un servicio WCF podría necesitar un punto de conexión diferente en entornos de prueba y producción. La aplicación Contoso University también incluye un valor de este tipo. Este valor controla un indicador visible en las páginas de un sitio que le indica en qué entorno está, como el de desarrollo, prueba o producción. El valor determina si la aplicación anexará "(Dev)" o "(Test)" al título principal de la página maestra Site.Master:

Environment indicator

El indicador de entorno se omite cuando la aplicación se ejecuta en almacenamiento provisional o producción.

Las páginas web de Contoso University leen un valor establecido en appSettings en el archivo Web.config para determinar en qué entorno se ejecuta la aplicación:

<appSettings>
    <add key="Environment" value="Dev" />
</appSettings>

El valor debe ser "Test" en el entorno de prueba y "Prod" para almacenamiento provisional y producción.

El código siguiente de un archivo de transformación implementará esta transformación:

<appSettings>
    <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

El valor de atributo "SetAttributes" de xdt:Transform indica que el propósito de esta transformación es cambiar los valores de atributo de un elemento existente en el archivo Web.config. El valor de atributo "Match(key)" de xdt:Locator indica que el elemento que se va a modificar es aquel cuyo atributokey coincide con el atributo key especificado aquí. El único atributo restante del elemento add es valuey es lo que se cambiará en el archivo Web.config implementado. El código que se muestra aquí hace que el atributo value del elemento EnvironmentappSettings se establezca en "Test" en el archivo Web.config implementado.

Esta transformación pertenece a los archivos de transformación de perfil de publicación, que aún no ha creado. Creará y actualizará los archivos de transformación que implementan este cambio al crear los perfiles de publicación para los entornos de prueba, almacenamiento provisional y producción. Lo hará en los tutoriales de implementación en IIS e implementación en producción.

Nota:

Como esta configuración está en el elemento <appSettings>, tiene otra alternativa para especificar la transformación al implementar en Web Apps en Azure App Service. Vea Especificación de valores de Web.config en Azure anteriormente en este tema.

Definición de cadenas de conexión

Aunque el archivo de transformación predeterminado contiene un ejemplo que muestra cómo actualizar un cadena de conexión, en la mayoría de los casos no es necesario configurar transformaciones de cadena de conexión, ya que puede especificar cadenas de conexión en el perfil de publicación. Lo hará en los tutoriales de implementación en IIS e implementación en producción.

Resumen

Ya ha hecho todo lo posible con las transformaciones de Web.config antes de crear los perfiles de publicación y ha obtenido una vista previa de lo que contendrá el archivo Web.config implementado.

Screenshot showing the Web.config Preview with the Original Web.config file on the left and what the Transformed Web.config file will look like on the right with the changes highlighted.

En el siguiente tutorial, se ocupará de las tareas de configuración de implementación que necesitan la configuración de propiedades del proyecto.

Más información

Para más información sobre los temas tratados en este tutorial, vea Uso de transformaciones de Web.config para cambiar los valores en el archivo Web.config de destino o app.config durante la implementación en el mapa de contenido de implementación web para Visual Studio y ASP.NET.