Error en la tarea de implementación web de VS2013 publish El archivo está en uso


Estoy usando VS2013 Premium para publicar un sitio en Windows Server 2012. Todos los archivos publish ok excepto estos: SqlServerTypes\x64 \ msvcr100.dll

SqlServerTypes\x64\SqlServerSpatial110.dll

SqlServerTypes\x86\msvcr100.dll

SqlServerTypes\x86\SqlServerSpatial110.dll

Recibo este tipo de errores para cada uno de los archivos anteriores que intenté publicar: Error en la tarea de implementación web. (El archivo 'msvcr100.dll' está en uso. Más información en: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE.)

Curiosamente, estos archivos se publicaron la primera vez (cuando no estaban en el servidor), entonces ya no se sobrescriben. Probado con 2 servidores web diferentes. He seguido la guía aquí: http://blogs.msdn.com/b/webdev/archive/2013/10/30/web-publishing-updates-for-app-offline-and-usechecksum.aspx

...Pero solo logró poner el sitio fuera de línea (VS está colocando el app_offline.htm) pero la publicación sigue fallando con el mismo error. Todos los demás archivos se publican perfectamente.

¿Alguna idea?

Author: user3546827, 2014-12-06

5 answers

Usted puede tomar que la aplicación fuera de línea durante la publicación que con suerte debería liberar el bloqueo en el archivo y le permitirá actualizarlo.

Yo blogueé sobre esto hace un tiempo. El soporte descrito se envió dentro del SDK de Azure y la actualización de Visual Studio. No recuerdo las liberaciones exactas pero puedo averiguarlo si es necesario. Cualquier actualización de citas alrededor / después de esa publicación del blog debería estar bien.

Requisitos previos:

  • VS 2012 + VS actualización / VS 2013 + VS Actualización / VS2015
  • MSDeploy v3

Nota: si está publicando desde un servidor CI, el servidor CI también necesitará las actualizaciones anteriores

Editar el perfil de publicación

En VS cuando se crea un perfil de publicación web, la configuración del cuadro de diálogo se almacena en Properties\PublishProfiles\ como archivos que terminan con .pubxml. Nota: también hay un archivo .pubxml.user, ese archivo no debe modificarse

Para desconectar la aplicación en el archivo .pubxml, agregue lo siguiente propiedad.

<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

Notas

ASP.NET Requerido

La forma en que esto se ha implementado en el lado de MSDeploy es que una app_offline.el archivo htm se coloca en la raíz del sitio web/aplicación. A partir de ahí el asp.net runtime lo detectará y desconectará tu aplicación. Debido a esto si su sitio web / aplicación no tiene asp.net habilitada esta función no funcionará.

Casos en los que puede no funcionar

La implementación de esto hace que sea tal que el es posible que la aplicación no esté estrictamente fuera de línea antes de que comience la publicación. Primero la app_offline.el archivo htm se deja caer, entonces MSDeploy comenzará a publicar los archivos. No espera para ASP.NET para detectar el archivo y realmente llevarlo fuera de línea. Debido a esto, puede encontrarse con casos en los que todavía se encuentre con el bloqueo de archivos. Por defecto VS habilita retrys por lo que generalmente la aplicación se desconectará durante una de las retrys y todo está bien. En algunos casos puede tomar más tiempo para ASP.NET para responder. Eso es un poco más difícil.

En el caso de que agregue <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline> y su aplicación no se desconecte lo suficientemente pronto, le sugiero que la desconecte antes de que comience la publicación. Hay varias maneras de hacer esto de forma remota, pero eso depende de su configuración. Si solo tienes acceso a MSDeploy puedes probar la siguiente secuencia:

  1. Usa msdeploy.exe para desconectar tu sitio soltando app_offline.htm
  2. Usa msdeploy.exe para publicar tu app (_megurate de que la sincronización no elimine app_offline.htm file_)
  3. Espere un poco de tiempo
  4. Publicar el sitio
  5. Use msdeploy.exe para poner la aplicación en línea eliminando app_offline.htm

He blogueado cómo puedes hacer esto en http://sedodream.com/2012/01/08/howtotakeyourwebappofflineduringpublishing.aspx. Lo único que falta en esa entrada de blog es el retraso para esperar a que el sitio realmente se tome fuera de línea. También puede crear un script que solo llame a msdeploy.exe directamente en lugar de integrarlo en el proceso de construcción/publicación del proyecto.

 22
Author: Sayed Ibrahim Hashimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 03:42:31

He encontrado la razón por la que la solución en http://blogs.msdn.com/b/webdev/archive/2013/10/30/web-publishing-updates-for-app-offline-and-usechecksum.aspx no funcionó para el póster original, y tengo una solución.

El problema con el enfoque EnableMSDeployAppOffline es que solo recicla el dominio de la aplicación que aloja la aplicación. No recicla el proceso de trabajo del grupo de aplicaciones (w3wp.exe) en la que reside el dominio de la aplicación.

Derribando y recreando el dominio de la aplicación no afectará a las DLL espaciales de Sql Server en cuestión. Esas DLL son código no administrado que se cargan manualmente a través de llamadas interop LoadLibray. Por lo tanto, las DLL viven fuera del ámbito del dominio de la aplicación.

Para liberar los bloqueos de archivos, que el proceso de grupo de aplicaciones pone en ellos, debe reciclar el grupo de aplicaciones o descargar las DLL de la memoria manualmente.

El Microsoft.SQLServer.Tipos nuget package envía una clase que se utiliza para cargar el espacio dll llamados SqlServerTypes.Utilidad. Puede modificar el método LoadNativeAssemblies para descargar las DLL no administradas cuando se descarga el dominio de la aplicación. Con esta modificación cuando msdeploy copys la app_offline.htm el dominio de la aplicación descargará y luego descargará también las DLL administradas.

private static IntPtr _msvcrPtr = IntPtr.Zero;
private static IntPtr _spatialPtr = IntPtr.Zero;

public static void LoadNativeAssemblies(string rootApplicationPath)
{
    if (_msvcrPtr != IntPtr.Zero || _spatialPtr != IntPtr.Zero)
        throw new Exception("LoadNativeAssemblies already called.");

    var nativeBinaryPath = IntPtr.Size > 4
        ? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
        : Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");

    _msvcrPtr = LoadNativeAssembly(nativeBinaryPath, "msvcr100.dll");
    _spatialPtr = LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial110.dll");

    AppDomain.CurrentDomain.DomainUnload += (sender, e) =>
    {
        if (_msvcrPtr != IntPtr.Zero)
        {
            FreeLibrary(_msvcrPtr);
            _msvcrPtr = IntPtr.Zero;
        }

        if (_spatialPtr != IntPtr.Zero)
        {
            FreeLibrary(_spatialPtr);
            _spatialPtr = IntPtr.Zero;
         }
    };
}

Hay una advertencia con este enfoque. Asume que su aplicación es la única que se ejecuta en el proceso de trabajo que utiliza las DLL espaciales. Dado que los grupos de aplicaciones pueden alojar múltiples aplicaciones, los bloqueos de archivos no se liberarán si otra aplicación también los ha cargado. Esto evitará que su implementación funcione con el mismo error de bloqueo de archivo.

 3
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 21:38:04

Hay problemas conocidos con IIS y bloqueos de archivos (por qué aún no se resuelven).

La pregunta que quiero hacer es, sin embargo, si es necesario volver a desplegar estos archivos?

Reconozco los nombres de archivo y los recuerdo como archivos del sistema que ya deberían estar presentes en el servidor o simplemente no necesitan ser re-desplegados.

No tengo mucha experiencia cuando se trata de IIS, pero me he encontrado con este problema antes y varios de mis compañeros de trabajo más experimentados me han dicho que esto es, como dije, un problema conocido de IIS y creo que la respuesta a su pregunta es:

  1. Evite desplegar archivos innecesarios.
  2. inténtalo de nuevo
  3. Restablecer sitio web
  4. inténtalo de nuevo
  5. iisreset
 1
Author: DOOMDUDEMX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 03:21:45

Creo que lo que sería más fácil de hacer es hacer que estas DLL sean tan copilocales como verdaderas. Estoy asumiendo que estas DLL se extraen de la carpeta de archivos de programa. Intente marcarlos como copylocal true y haga una implementación.Intente detener cualquier proceso local de IIS que se ejecute en su máquina local.

 1
Author: qamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 03:25:44

Tenga cuidado de que no tiene uno de esos nuevos servicios de copia de seguridad en la nube en ejecución que está tomando bloqueos de archivos, y tampoco tiene cosas abiertas en el explorador o una herramienta de inspección DLL.

Creo que es un poco ridículo que la EM no haga mejores provisiones para este problema. Encuentro que 9 de cada 10 veces mi implementación funciona bien, pero luego, a medida que aumenta nuestro tráfico, puede convertirse en 1 de cada 10 veces.

Voy a resolver el problema con:

  • dos aplicaciones MySite.A y MySite.B, donde solo se ejecuta uno a la vez.
  • Siempre me desplazo al sitio inactivo.
  • Si hay un problema durante la implementación, nunca causará que todo el sitio se caiga.
  • Si hay un problema importante después de la implementación, puede revertir muy fácilmente.

No estoy muy seguro de cómo lo estoy implementando, pero creo que esto es lo que necesito hacer.

 0
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-14 22:14:33