Implementación de una aplicación web de ASP.NET con SQL Server Compact mediante Visual Studio o Visual Web Developer: solución de problemas (12 de 12)

de Tom Dykstra

Descarga del proyecto de inicio

En esta serie de tutoriales se muestra cómo implementar (publicar) un proyecto de aplicación web de ASP.NET que incluye una base de datos de SQL Server Compact mediante Visual Studio 2012 RC o Visual Studio Express 2012 RC para la web. También puede usar Visual Studio 2010 si instala la actualización de publicación web. Para obtener una introducción a la serie, consulte el primer tutorial de la serie.

Para ver un tutorial que muestra las características de implementación introducidas después de la versión RC de Visual Studio 2012, muestra cómo implementar ediciones de SQL Server distintas de SQL Server Compact y muestra cómo implementar en Windows Azure Web Services, consulte Implementación web de ASP.NET con Visual Studio.

En esta página, se describen algunos problemas comunes que pueden surgir al implementar una aplicación web de ASP.NET mediante Visual Studio. Para cada uno, se proporcionan una o varias causas posibles y las soluciones correspondientes.

Error del servidor en la aplicación '/': la configuración de error personalizada actual impide que los detalles del error se vean de forma remota

Escenario

Después de implementar un sitio en un host remoto, recibe un mensaje de error que menciona la configuración customErrors en el archivo Web.config, pero no indica la causa real del error:

Server Error in '/' Application.
Runtime Error 

Description: An application error occurred on the server. The current custom error settings 
for this application prevent the details of the application error from being viewed remotely 
(for security reasons). It could, however, be viewed by browsers running on the local server 
machine. 

Details: To enable the details of this specific error message to be viewable on remote machines,
please create a <customErrors> tag within a "web.config" configuration file located in the
root directory of the current web application. This <customErrors> tag should then have its
"mode" attribute set to "Off".

Causa posible y solución

De forma predeterminada, ASP.NET muestra información detallada de errores solo cuando la aplicación web se ejecuta en el equipo local. Por lo general, usted no debería mostrar información detallada de errores cuando la aplicación web está disponible públicamente a través de Internet, ya que es posible que los hackers puedan usar esta información para encontrar vulnerabilidades en la aplicación. Sin embargo, al implementar un sitio o actualizaciones en un sitio, a veces algo sale mal y necesita obtener el mensaje de error real.

Para permitir que la aplicación muestre mensajes de error detallados cuando se ejecuta en el host remoto, edite el archivo Web.config para desactivar el modo customErrors, vuelva a implementar la aplicación y, luego, vuelva a ejecutarla:

  1. Si el archivo Web.config de la aplicación tiene un customErrors elemento en el system.web elemento, cambie el mode atributo a "off". De lo contrario, agregue un customErrors elemento en el system.web elemento con el mode atributo establecido en "off", como se muestra en el ejemplo siguiente:

    <configuration>
      <system.web>
        <customErrors mode="off"/>
      </system.web>
    </configuration>
    
  2. Implemente la aplicación.

  3. Ejecute la aplicación y repita lo que haya hecho anteriormente cuando se produjo el error. Ahora puede ver cuál es el mensaje de error real.

  4. Cuando haya resuelto el error, restaure la configuración customErrors original y vuelva a implementar la aplicación.

El acceso se deniega en una página web que usa SQL Server Compact

Escenario

Al implementar un sitio que usa SQL Server Compact y ejecuta una página en el sitio implementado que tiene acceso a la base de datos, ve el siguiente mensaje de error:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Causa posible y solución

La cuenta NETWORK SERVICE del servidor debe poder leer los archivos binarios nativos de SQL Service Compact que se encuentran en la carpeta bin\amd64 o bin\x86, pero no tiene permisos de lectura para esas carpetas. Establezca el permiso de lectura para NETWORK SERVICE en la carpeta bin y asegúrese de ampliar los permisos a las subcarpetas.

No se puede leer el archivo de configuración debido a permisos insuficientes

Escenario

Al hacer clic en el botón Publicar de Visual Studio para implementar una aplicación en IIS en el equipo local, se produce un error en la publicación y la ventana Salida muestra un mensaje de error similar al siguiente:

An error occurred when reading the IIS Configuration File 'MACHINE/REDIRECTION'. 
The identity performing this operation was ... Error: Cannot read configuration file due to insufficient permissions.

Causa posible y solución

Para usar la publicación con un solo clic en IIS en el equipo local, debe ejecutar Visual Studio con permisos de administrador. Cierre Visual Studio y reinícielo con permisos de administrador.

No se pudo conectar al equipo de destino... Uso del proceso especificado

Escenario

Al hacer clic en el botón Publicar de Visual Studio para implementar una aplicación, se produce un error en la publicación y la ventana Salida muestra un mensaje de error similar al siguiente:

Web deployment task failed.(Could not connect to the destination computer ("<server URL>") using the specified process
("The Web Management Service"). This can happen if a proxy server is interrupting communication with the destination server. 
Disable the proxy server and try again.) ... The remote server returned an error: (502) Bad Gateway.

Causa posible y solución

Un servidor proxy interrumpe la comunicación con el servidor de destino. En el panel de control de Windows o en Internet Explorer, seleccione Opciones de Internet y seleccione la pestaña Conexiones. En el cuadro de diálogo Propiedades de Internet, haga clic en Configuración de LAN. En el cuadro de diálogo Configuración de red de área local (LAN), desactive la casilla Detectar automáticamente la configuración. A continuación, vuelva a hacer clic en el botón "publicar".

Si el problema persiste, comuníquese con el administrador del sistema para determinar lo que se puede hacer con la configuración de proxy o firewall. El problema se produce porque Web Deploy usa un puerto no estándar para la implementación del servicio de administración web (8172); para otras conexiones, Web Deploy usa el puerto 80. Cuando se implementa en un proveedor de hospedaje de terceros, se suele usar el servicio de administración web.

El grupo de aplicaciones predeterminado de .NET 4.0 no existe

Escenario

Al implementar una aplicación que requiera .NET Framework 4, ve el siguiente mensaje de error:

The default .NET 4.0 application pool does not exist or the application could not be added. 
Please verify that ASP.NET 4.0 is installed on this machine.

Causa posible y solución

ASP.NET 4 no está instalado en IIS. Si el servidor en el que va a realizar la implementación es el equipo de desarrollo y tiene Visual Studio 2010 instalado en él, entonces ASP.NET 4 ya está instalado en el equipo, pero es posible que no esté instalado en IIS. En el servidor en el que va a realizar la implementación, abra un símbolo del sistema con privilegios elevados e instale ASP.NET 4 en IIS ejecutando los siguientes comandos:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

También es posible que tenga que establecer manualmente la versión de .NET Framework del grupo de aplicaciones predeterminado. Para más información, consulte el tutorial Implementación en IIS como entorno de prueba.

El formato de la cadena de inicialización no es conforme a la especificación que comienza en el índice 0.

Escenario

Después de implementar una aplicación mediante publicación con un solo clic, al ejecutar una página que tenga acceso a la base de datos, recibirá el siguiente mensaje de error:

Format of the initialization string does not conform to specification starting at index 0.

Causa posible y solución

Abra el archivo Web.config en el sitio implementado y compruebe si los valores de la cadena de conexión comienzan por $(ReplaceableToken_, como en el ejemplo siguiente:

<connectionStrings>
  <add name="DefaultConnection" connectionString="$(ReplaceableToken_DefaultConnection-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
  <add name="SchoolContext" connectionString="$(ReplaceableToken_SchoolContext-Web.config Connection String_0)" providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>

Si las cadenas de conexión tienen un aspecto similar a este ejemplo, edite el archivo del proyecto y agregue la siguiente propiedad al elemento PropertyGroup para todas las configuraciones de compilación:

<AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings>

A continuación, vuelva a implementar la aplicación.

HTTP 500: error interno del servidor

Escenario

Al ejecutar el sitio implementado, ve el siguiente mensaje de error sin información específica que indique la causa del error:

HTTP Error 500 - Internal Server Error.

Causa posible y solución

Hay muchas causas de errores 500, pero una posible causa, si sigue estos tutoriales, es que coloca un elemento XML en un lugar incorrecto en uno de los archivos de transformación XML. Por ejemplo, recibirá este error si coloca la transformación que inserta un <location> elemento en <system.web> en lugar de directamente en <configuration>. La solución en ese caso es corregir el archivo de transformación XML y volver a implementar.

HTTP 500.21: error interno del servidor

Escenario

Al ejecutar el sitio implementado, ve el siguiente mensaje de error:

HTTP Error 500.21 - Internal Server Error. 
Handler "PageHandlerFactory-Integrated" has a bad module "ManagedPipelineHandler" in its module list.

Causa posible y solución

El sitio que ha implementado tiene destinos ASP.NET 4, pero ASP.NET 4 no está registrado en IIS en el servidor. En el servidor, abra un símbolo del sistema con privilegios elevados y registre ASP.NET 4 ejecutando los siguientes comandos:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –iru

También es posible que tenga que establecer manualmente la versión de .NET Framework del grupo de aplicaciones predeterminado. Para más información, consulte el tutorial Implementación en IIS como entorno de prueba.

Error de inicio de sesión al abrir la base de datos de SQL Server Express en App_Data

Escenario

Ha actualizado la cadena de conexión del archivo Web.config para que apunte a una base de datos de SQL Server Express como un archivo .mdf en la carpeta App_Data y la primera vez que ejecuta la aplicación ve el siguiente mensaje de error:

System.Data.SqlClient.SqlException: Cannot open database "DatabaseName" requested by the login. The login failed.

Causa posible y solución

El nombre del archivo .mdf no puede coincidir con el nombre de ninguna base de datos de SQL Server Express que haya existido en el equipo, incluso si ha eliminado el archivo .mdf de la base de datos existente anteriormente. Cambie el nombre del archivo .mdf por un nombre que nunca se haya usado como nombre de base de datos y cambie el archivo Web.config de modo que use el nuevo nombre. Como alternativa, puede usar SQL Server Management Studio Express para eliminar bases de datos de SQL Server Express que hayan existido anteriormente.

No se puede comprobar la compatibilidad del modelo

Escenario

Ha actualizado la cadena de conexión del archivo Web.config para que apunte a una nueva base de datos de SQL Server Express y la primera vez que ejecuta la aplicación ve el siguiente mensaje de error:

Model compatibility cannot be checked because the database does not contain model metadata. 
Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

Causa posible y solución

Si el nombre de la base de datos que ha colocado en el archivo Web.config se ha usado antes en el equipo, es posible que ya exista una base de datos con algunas tablas en él. Seleccione un nuevo nombre que no se haya usado en el equipo antes y cambie el archivo Web.config para que pueda usar este nuevo nombre de base de datos. O bien, puede usar SQL Server Management Studio Express para eliminar la base de datos existente.

Error de SQL cuando un script intenta crear usuarios o roles

Escenario

Está usando la implementación de base de datos configurada en la pestaña Paquete/Publicación de SQL, los scripts SQL que se ejecutan durante la implementación incluyen los comandos Crear usuario o Crear rol, y se produce un error en la ejecución de scripts cuando se ejecutan esos comandos. Es posible que vea mensajes más detallados, como los siguientes:

The approximate location of the error was between lines '1' and '3' of the script. 
The verbose log may have more information about the error. The command started with:
CREATE USER [user2] FOR LOGIN [user2] WITH DEFAULT
Error: User does not have permission to perform this action.

Si este error se produce cuando ha configurado la implementación de la base de datos en el asistente para Publicar sitio web en lugar de la pestaña Paquete/Publicar SQL, cree un subproceso en el foro Configuración e implementación y la solución se agregará a esta página de solución de problemas.

Causa posible y solución

La cuenta de usuario que usa para realizar la implementación no tiene permiso para crear usuarios o roles. Por ejemplo, la empresa de hospedaje podría asignar los roles db_datareader, db_datawritery db_ddladmin a la cuenta de usuario que configura. Estos son suficientes para crear la mayoría de los objetos de base de datos, pero no para crear usuarios o roles. Una manera de evitar el error es excluir usuarios y roles de la implementación de la base de datos. Para ello, edite el elemento PreSource para el script generado automáticamente de la base de datos para que incluya los atributos siguientes:

CopyAllUsers=false, CopyAllRoles=false

Para obtener información sobre cómo editar el elemento PreSourceen el archivo de proyecto, consulte Procedimiento: Editar los valores de implementación de SQL en el archivo de proyecto. Si los usuarios o roles de la base de datos de desarrollo deben estar en la base de datos de destino, comuníquese con el proveedor de hospedaje para obtener ayuda.

Error de tiempo de espera de SQL Server al ejecutar scripts personalizados durante la implementación

Escenario

Ha especificado scripts SQL personalizados para ejecutarse durante la implementación y, cuando Web Deploy los ejecuta, se agota el tiempo de espera.

Causa posible y solución

La ejecución de varios scripts que tienen diferentes modos de transacción puede provocar errores de tiempo de espera. De forma predeterminada, los scripts generados automáticamente se ejecutan en una transacción, pero los scripts personalizados no lo hacen. Si selecciona la opción Extraer datos y/o esquema de una base de datos existente en la pestaña Empaquetar/publicar SQL y, si agrega un script SQL personalizado, debe cambiar la configuración de transacción en algunos scripts para que todos los scripts usen la misma configuración de transacción. Para más información, consulte Procedimiento: Implementar una base de datos con un proyecto de aplicación web.

Si ha configurado las opciones de transacción para que todo sea lo mismo, pero sigue recibiendo este error, una posible solución alternativa es ejecutar los scripts por separado. En la cuadrícula Scripts de base de datos de la pestaña Empaquetar/publicar de SQL, desactive la casilla Incluir del script que provoca el error de tiempo de espera y, después, publique el proyecto. Después, vuelva a la cuadrícula Scripts de base de datos, active la casilla Incluir del script y desactive las casillas Incluir de los demás scripts. Luego, vuelva a publicar el proyecto. Esta vez, cuando se publica, solo se ejecuta el script personalizado seleccionado.

Los datos de flujo del manifiesto del sitio aún no están disponibles

Escenario

Al instalar un paquete mediante el archivo deploy.cmd con la opción t (prueba), ve el siguiente mensaje de error:

Error: The stream data of 'sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript' is not yet available.

Causa posible y solución

El mensaje de error significa que el comando no puede generar un informe de prueba. Sin embargo, el comando puede ejecutarse si usa la opción y (instalación real). El mensaje solo indica que hay un problema al ejecutar el comando en modo de prueba.

Esta aplicación requiere ManagedRuntimeVersion v4.0

Escenario

Al intentar realizar la implementación, ve el siguiente mensaje de error:

Error: Los datos de secuencia de "sitemanifest/dbFullSql[@path='C:\TEMP\AdventureWorksGrant.sql']/sqlScript" aún no están disponibles. El grupo de aplicaciones que está intentando usar tiene la propiedad "managedRuntimeVersion" establecida en "v2.0". Esta aplicación requiere "v4.0".

Causa posible y solución

ASP.NET 4 no está instalado en IIS. Si el servidor en el que va a realizar la implementación es el equipo de desarrollo y tiene Visual Studio 2010 instalado en él, entonces ASP.NET 4 ya está instalado en el equipo, pero es posible que no esté instalado en IIS. En el servidor en el que va a realizar la implementación, abra un símbolo del sistema con privilegios elevados e instale ASP.NET 4 en IIS ejecutando los siguientes comandos:

cd %windir%\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe –i

No se puede convertir Microsoft.Web.Deployment.DeploymentProviderOptions

Escenario

Al implementar un paquete, ve el siguiente mensaje de error:

Unable to cast object of type 'Microsoft.Web.Deployment.DeploymentProviderOptions' to 'Microsoft.Web.Deployment.DeploymentProviderOptions'.

Causa posible y solución

Está intentando realizar la implementación desde el Administrador de IIS mediante la interfaz de usuario de Web Deploy 1.1 en un servidor que tenga Web Deploy 2.0 instalado. Si usa la herramienta de administración remota de IIS para implementar mediante la importación de un paquete, active el cuadro de diálogo Nuevas características disponibles al establecer la conexión. (Este cuadro de diálogo solo se puede mostrar una vez cuando se establece la conexión por primera vez. Para borrar la conexión y empezar de nuevo, cierre el Administrador de IIS y vuelva a iniciarlo escribiendo inetmgr /reset en el símbolo del sistema). Si una de las características enumeradas es la interfaz de usuario de Web Deploy y tiene un número de versión inferior a 8, es posible que el servidor que va a implementar tenga instaladas las versiones 1.1 y 2.0 de Web Deploy. Para implementar desde un cliente que tenga instalada la versión 2.0, el servidor solo debe tener instalado Web Deploy 2.0. Tendrá que comunicarse con el proveedor de hospedaje para resolver este problema.

No se pueden cargar los componentes nativos de SQL Server Compact

Escenario

Al ejecutar el sitio implementado, ve el siguiente mensaje de error:

Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8482. 
Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.

Causa posible y solución

El sitio implementado no tiene subcarpetas amd64 y x86 con los ensamblados nativos en ellos en la carpeta bin de la aplicación. En un equipo con SQL Server Compact instalado, los ensamblados nativos se encuentran en C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private. La mejor manera de obtener los archivos correctos en las carpetas correctas de un proyecto de Visual Studio es instalar el paquete SqlServerCompact de NuGet. La instalación del paquete agrega un script posterior a la compilación para copiar los ensamblados nativos en amd64 y x86. Sin embargo, para que estos se implementen, debe incluirlos manualmente en el proyecto. Para más información, consulte el tutorial Implementación de SQL Server Compact.

Error "Ruta de acceso no válida" después de implementar una aplicación de Entity Framework Code First

Escenario

Implemente una aplicación que use migraciones de Entity Framework Code First y un DBMS, como SQL Server Compact, que almacena su base de datos en un archivo de la carpeta App_Data. Tiene migraciones de Code First configuradas para crear la base de datos después de la primera implementación. Al ejecutar la aplicación, recibe un mensaje de error como el ejemplo siguiente:

The path is not valid. Check the directory for the database. [Path = c:\inetpub\wwwroot\App_Data\DatabaseName.sdf ]

Causa posible y solución

Code First está intentando crear la base de datos, pero la carpeta App_Data no existe. O bien, no tenía ningún archivo en la carpeta App_Data cuando ha implementado o seleccionado Excluir App_Data en la pestaña Empaquetar/publicar web de la ventana Propiedades del proyecto. El proceso de implementación no creará una carpeta en el servidor si no hay ningún archivo en la carpeta que copiar en el servidor. Si ya tenía la base de datos configurada en el sitio, el proceso de implementación eliminará los archivos y la carpeta App_Data si ha seleccionado Quitar archivos adicionales en el destino en el perfil de publicación. Para solucionar el problema, coloque un archivo de marcador de posición como un archivo .txt en la carpeta App_Data, asegúrese de que no tiene App_Data seleccionada y vuelva a implementarlo.

"No se puede utilizar un objeto COM que se ha separado de su contenedor RCW subyacente".

Escenario

Ha usado correctamente la publicación con un solo clic para implementar la aplicación, pero después empieza a recibir este error:

Web deployment task failed. (Could not complete the request to remote agent URL 'https://serverurl.com/msdeploy.axd?site=sitename'.)
Could not complete the request to remote agent URL 'https://url/msdeploy.axd?site=sitename'.
The request was aborted: The request was canceled.
COM object that has been separated from its underlying RCW cannot be used.

Causa posible y solución

Por lo general, basta con cerrar y reiniciar Visual Studio para resolver este error.

Se produce un error en la implementación porque las credenciales de usuario usadas para la publicación no tienen la entidad setACL

Escenario

La publicación produce un error que indica que no tiene autoridad para establecer permisos de carpeta (la cuenta de usuario que usa no tiene la entidad setACL).

Causa posible y solución

De forma predeterminada, Visual Studio establece permisos de lectura en la carpeta raíz del sitio y permisos de escritura en la carpeta App_Data. Si sabe que los permisos predeterminados en las carpetas del sitio son correctos y no es necesario establecerlos, deshabilite este comportamiento. Para hacerlo, agregue IncludeSetACLProviderOn Destination<>False</IncludeSetACLProviderOnDestination> al archivo de perfil de publicación (para afectar a un único perfil) o al archivo wpp.targets (para afectar a todos los perfiles). Para obtener información sobre cómo editar estos archivos, consulte Procedimiento: Editar la configuración de implementación en archivos de perfil (.pubxml).

Errores de acceso denegado cuando la aplicación intenta escribir en una carpeta de aplicación

Escenario

La aplicación produce errores cuando intenta crear o editar un archivo en una de las carpetas de la aplicación, ya que no tiene autoridad de escritura para esa carpeta.

Causa posible y solución

De forma predeterminada, Visual Studio establece permisos de lectura en la carpeta raíz del sitio y permisos de escritura en la carpeta App_Data. Si la aplicación necesita acceso de escritura a una subcarpeta, puede establecer permisos para esa carpeta, como se muestra en los tutoriales Configuración de permisos de carpeta e Implementación en el entorno de producción. Si la aplicación necesita acceso de escritura a la carpeta raíz del sitio, debe impedir que establezca el acceso de solo lectura en la carpeta raíz. Para hacerlo, agregue <IncludeSetACLProviderOn Destination>False</IncludeSetACLProviderOnDestination> al archivo de perfil de publicación (para afectar a un único perfil) o al archivo wpp.targets (para afectar a todos los perfiles). Para obtener información sobre cómo editar estos archivos, consulte Procedimiento: Editar la configuración de implementación en archivos de perfil (.pubxml).

Error de configuración: el atributo targetFramework hace referencia a una versión posterior a la versión instalada de .NET Framework

Escenario

Ha publicado correctamente un proyecto web que tiene como destino ASP.NET 4.5, pero, al ejecutar la aplicación (con el modo customErrors establecido en "off" (desactivado) en el archivo Web.config), obtiene el siguiente error:

The 'targetFramework' attribute in the <compilation> element of the Web.config 
file is used only to target version 4.0 and later of the .NET Framework (for 
example, '<compilation targetFramework="4.0">'). The 'targetFramework' attribute 
currently references a version that is later than the installed version of the 
.NET Framework. Specify a valid target version of the .NET Framework, or install 
the required version of the .NET Framework.

El cuadro Error de origen de la página de error resalta la siguiente línea de Web.config como causa del error:

<compilation targetFramework="4.5" />

Causa posible y solución

El servidor no admite ASP.NET 4.5. Comuníquese con el proveedor de hospedaje para determinar cuándo (y si es que) se puede agregar compatibilidad con ASP.NET 4.5. Si la actualización del servidor no es una opción, debe implementar un proyecto web que tenga como destino ASP.NET 4 o versiones anteriores en su lugar. Si implementa un proyecto web de ASP.NET 4 o anterior en el mismo destino, active la casilla Quitar archivos adicionales en el destino en la pestaña Configuración del asistente Publicar web. Si no selecciona Quitar archivos adicionales en el destino, seguirá recibiendo la página Error de configuración.

Las ventanas Propiedades del proyecto incluyen una lista desplegable Plataforma de destino, pero no se puede resolver este problema simplemente cambiando de .NET Framework 4.5 a .NET Framework 4. Si cambia la plataforma de destino a una versión de marco anterior, el proyecto seguirá teniendo referencias a los ensamblados de la versión del marco posterior y no se ejecutará. Tiene que cambiar manualmente esas referencias o crear un proyecto que tenga como destino .NET Framework 4 o versiones anteriores. Para obtener más información, consulte .NET Framework como destino para sitios web.