Saltar al contenido

ASP.NET MVC 5 publica problemas de precompilación

Nuestro equipo redactor ha estado largas horas investigando soluciones a tu interrogante, te brindamos la resolución así que nuestro objetivo es serte de gran ayuda.

Solución:

Quería averiguarlo exactamente cuáles eran las diferencias entre:

  • “No fusionar” y “No fusionar. Cree un ensamblaje independiente para cada página y control”.
    • Parece que estos hacen lo mismo, ¿cuál es la diferencia?
  • “Combinar todas las salidas en un solo ensamblaje” y “Combinar todas las páginas y controlar las salidas en un solo ensamblaje”
    • Nuevamente, estos suenan como lo mismo (cuando no tienes un App_Code carpeta).

Y quiero averiguar por qué “Permitir que el sitio precompilado sea actualizable” no pareció hacer nada cuando se verificó (es decir, pensé que precompilaría las páginas en sus propios ensamblajes / ensamblajes mientras además emitiendo el original editable *.aspx, .ascx, .master archivos.

Entonces, hoy me senté y creé una hoja de cálculo y ejecuté cada configuración de Precompilación de perfil de publicación diferente con una aplicación ASP.NET WebForms * .csproj; también quería ver cuál era la salida más lenta frente a la más rápida.

Fondo:

  • Mi proyecto ASP.NET apunta a .NET Framework 4.7.2
  • No es un “proyecto de sitio web”.
  • C # crudo *.cs los archivos no se publican en el servidor web de producción.
  • Es un proyecto de WebForms que usa *.aspx, *.ascx, *.master, *.ashx y Global.asax. No es un proyecto MVC que usa Razor *.cshtml ni WebForms *.aspx motores de vista).
  • No usa el App_Code carpeta (por lo que la opción “Tratar como componente de biblioteca” no tiene ningún efecto).

Recomendaciones:

Notas importantes:

  • Estos resultados solo se aplican si está trabajando con un proyecto de aplicación web de formularios web ASP.NET “tradicional”. Estos no se aplican a los proyectos de sitios web ASP.NET (donde no tiene un *.csproj file), proyectos ASP.NET MVC (no Core) ni proyectos ASP.NET Core.
  • Utilizo el término “archivos de página” como abreviatura de *.aspx, *.ascx, *.master, *.asmx, y *.ashx archivos, pero noGlobal.asax.
  • Utilizo el término “Construido normalmente” para referirme a hacer un “Proyecto de construcción> Reconstrucción” en Visual Studio, donde se ve la salida en su %projectdir%bin directorio. Esto se compara con hacer una compilación de publicación (que primero realizará una compilación normal y luego copiará la salida a otro directorio para ejecutar los pasos de publicación de MSBuild)

Estos son mis hallazgos sobre los resultados de cada opción:

  • “Precompilar durante la publicación” (en la ventana Configuración de publicación)

    • Si no tienes un App_Code carpeta y desea publicar editable *.aspx/*.ascx/`*.master, entonces no hay razón de rendimiento para marcar esta casilla.
      • Esto se debe a que cuando está marcado pero “Permitir que el sitio precompilado sea actualizable” es desenfrenado entonces solo precompilará tu Global.asax archivo (no tu Global.asax.cs, que se compila de todos modos).
      • es decir, tu *.aspx, *.ascx, *.master y *.ashx los archivos serán no precompilarse en un ensamblado, y aún deberán compilarse bajo demanda en el servidor web.
      • Pero todavía los precompilará para comprobar si hay errores del compilador y <% @-líneas en tu *.aspx, *.ascx, *.master, *.asax y *.ashx archivos.
  • "Permitir que el sitio precompilado sea actualizable"

    • Cuando esto marcó su *.aspx, *.ascx, *.master y *.ashx los archivos serán no precompilarse en un ensamblado, y aún deberán compilarse bajo demanda en el servidor web.
      • Originalmente pensé que precompilaría esos archivos en un ensamblado (DLL) y, además, publicaría el original *.aspx archivos para editarlos en el servidor y solo recompilarlos si se modifican, pero estaba equivocado.
  • Emitir información de depuración

    • Esto genera *.pdb archivos para cada nuevo ensamblado generado por el proceso de precompilación. Lo hace no afectar a cualquier *.pdb archivos ya presentes cuando su aplicación se compila normalmente.
    • Creo que esto siempre debería estar habilitado: los archivos PDB son esenciales para investigar rápidamente los problemas de tiempo de ejecución y no agregan demasiado al tamaño de publicación final.
  • No fusionar

    • Cuando no tienes un App_Code carpeta y "Permitir que el sitio precompilado sea actualizable" está marcado, luego "No fusionar" solo se precompilará completamente Global.asax dentro App_global.asax.dll. No se agregarán otros archivos DLL a la salida de publicación final.

    • Cuando "Permitir que el sitio precompilado sea actualizable" está desmarcado, todos Archivos de paginación (definido en "Notas importantes" arriba) se compilará en nuevos archivos DLL App_Web_xxxxxxxx.dll en grupos de 10 clases.

      • No veo cómo decide agrupar archivos con un patrón para los 10 archivos que usa; a veces están en orden alfabético, otras veces es arbitrario.
  • No se fusionen. Cree un ensamblaje independiente para cada página y control.

    • Esto es lo mismo que el anterior, excepto que en lugar de estar en grupos de 10 Archivos de paginación (o clases) por asamblea, es 1-Archivo de página-por-montaje.
    • Esta también es una de las compilaciones de publicación más lentas cuando "Permitir que el sitio precompilado sea actualizable" no está marcado.
    • La única ventaja de este enfoque es si desea reemplazar individualmente los archivos precompilados de cada página. *.dll en el servidor, pero no creo que sea una buena idea, ya que a menudo se rompe, es mejor reemplazar todos los archivos a la vez. Solo haga esto si tiene una conexión de 56K y solo puede cargar menos de 100KB a la vez, lo cual es una tontería.
  • Fusionar todas las salidas en un solo ensamblaje

    • Realmente compila / fusiona todo Archivos de paginaciónyGlobal.asax (App_global.asax.dll) a un solo archivo DLL.
  • Tratar como componente de biblioteca

    • Esta opción no tuvo ningún efecto en mi proyecto, ya sea que esté marcada o no (ya que mi proyecto no tiene una App_Code carpeta).
  • Fusionar la salida de cada carpeta individual en su propio ensamblaje

    • Esto genera archivos DLL intermedios para cada directorio del sistema de archivos de su proyecto que contiene Archivos de paginación y luego los combina en una sola DLL para cada carpeta.
    • Esta opción resultó en el segundo tiempo de compilación de publicación más largo.
    • No puedo pensar en una buena razón por la que necesitaría usar esta función hoy, a menos que tenga un proyecto con miles de Archivos de paginación repartidos en decenas de carpetas y desea realizar actualizaciones incrementales manuales. (es decir, esta no es una opción que usaría en un proceso de CI / CD).
  • Fusionar todas las páginas y salidas de control en un solo ensamblaje

    • Si tienes un App_Code carpeta:
      • Entonces el contenido de App_Code (y otras "carpetas especiales" como App_GlobalResources, App_WebReferences) se precompilará en este ensamblado independiente de su Archivos de paginación montaje. Esta voluntad no incluir Global.asax (compilado para App_global.asax.dll).
    • Si no tienes un App_Code carpeta, entonces esta opción da como resultado una salida muy similar a "Fusionar todas las salidas en un solo ensamblaje", excepto que la salida final se precompilará Global.asax a su propia asambleaApp_global.asax.dll).
      • Esta opción resultó en el tiempo de compilación de publicación más largo de todas las opciones, sin ningún beneficio real en mi caso.
      • Entonces, si no tienes un App_Code carpeta, entonces no hay razón para elegir esta opción.

Reformulado:

Cuando "Permitir que el sitio precompilado sea actualizable" está marcado y "No fusionar" está marcado:

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Compiled only for error-checking.
    * Not compiled to an assembly DLL in the `bin` folder.

Global.asax

    * Compiled to `App_global.asax.dll`

App_Code

    * Compiled to `App_Code.dll`

Cuando "Permitir que el sitio precompilado sea actualizable" no está marcado y "No fusionar" está marcado:

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Compiled to `App_Web_abcdefghij.dll` in groups of 10-per-DLL

Global.asax

    * Compiled to `App_global.asax.dll`

App_Code

    * Compiled to `App_Code.dll`

Cuando "Permitir que el sitio precompilado sea actualizable" no está marcado y "Combinar cada salida de carpeta individual en su propio ensamblado" está marcado:

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Each file compiled to its own `App_Web_OriginalFileName.abcdefghij.dll` file.

Global.asax

    * Compiled to `App_global.asax.dll`

App_Code

    * Compiled to `App_Code.dll`

Cuando "Permitir que el sitio precompilado sea actualizable" no está marcado y "Combinar todas las salidas en un solo ensamblado (llamado 'Todo')" está marcado:

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Compiled and merged into the single Everything.dll

Global.asax

    * Compiled and merged into the single Everything.dll

App_Code

    * Compiled and merged into the single Everything.dll

Cuando "Permitir que el sitio precompilado sea actualizable" no está marcado y "Combinar cada salida de carpeta individual en su propio ensamblado" está marcado:

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Compiled into an assembly for each folder.

Global.asax

    * Compiled to `App_global.asax.dll` (separate from the assembly for the *.aspx files in the root directory)

App_Code

    * Compiled and merged into `App_Code.dll`

Cuando se marca "Combinar todas las páginas y salidas de control en un solo ensamblado (llamado 'PagesAndControls')":

*.aspx
*.ascx
*.ashx
*.asmx
*.master

    * Compiled into PagesAndControls.dll

Global.asax

    * Compiled to `App_global.asax.dll` (separate from PagesAndControls.dll)

App_Code

    * Compiled and merged into `App_Code.dll`

Conclusión:

Si no necesita editar *.aspx/*.ascx, /*.master archivos una vez implementados, y no tiene un App_Code carpeta, luego elija estas configuraciones para obtener los mejores resultados:

[ ] Allow precompiled site to be updatable
[X] Emit debug information
[X] Merge all outputs to a single assembly 
[ ] Treat as library component

Metodología:

  • Todas las compilaciones utilizan Release.
  • Se utilizó un perfil de publicación de "Carpeta".
    • El objetivo era una carpeta en el mismo volumen de disco (una unidad PCI-Express Optane).
    • La carpeta se borró después de cada ejecución.
  • El único cambio entre cada ejecución de prueba fue cambiar los parámetros en el
  • git confirmó cero cambios en los archivos de origen y los archivos de proyecto antes de cada compilación y publicación.
  • Ejecuté un script de shell que borra completamente el bin y obj directorios entre cada ejecución, por lo que el proyecto de la aplicación web se reconstruye completamente entre ejecuciones en lugar de solo Publicar).
  • Utilicé un programa de cronómetro que registró la hora exacta en que hice clic en el botón Publicar, pero se detuvo manualmente al presionar el teclado cuando vi que se completó la operación Publicar.

Resultados:

(Captura de pantalla de mi hoja de cálculo)

Captura de pantalla de la hoja de cálculo de Excel de las opciones de entrada de precompilación y la salida observada

Usos de Visual Studio Herramienta de compilación ASP.NET y Herramienta de combinación ASP.NET cuales son los Aspnet_compiler.exe y Aspnet_merge.exe para compilar una aplicación ASP.NET.

Behind the scene VS utiliza estas 2 herramientas para compilar proyectos de aplicaciones web. Alternativamente, puede invocar estas 2 herramientas desde la línea de comando.

Puede localizar estos 2 archivos navegando a este directorio: %WINDIR%Microsoft.NETFrameworkv4.0.30319 (oa cualquier versión de framework que esté usando). Puede utilizar estas herramientas para compilar aplicaciones ASP.NET. Para obtener más información sobre todas las opciones de estas 2 herramientas, lea estos enlaces: Aspnet_compiler.exe y Aspnet_merge.exe

Mi recomendación para solucionar el problema:

  • Reinicie Visual Studio
  • Limpio Reconstruye tu solución
  • Debe ingresar solo el nombre del ensamblado sin el .dll (in your example Dashboard.Precompiled.dll should be just Dashboard.Precompiled)
  • (puede considerar) Reiniciar su máquina

Por favor Lea más sobre la configuración de precompilación avanzada en este enlace, también pegaré aquí las opciones:

Permitir que el sitio precompilado sea actualizable - Esta configuración corresponde a la opción –u del comando aspnet_compiler.exe. Si selecciona esta opción, las páginas y los controles de usuario (archivos .aspx, .ascx y .master) se copian tal cual en la carpeta de destino y se pueden actualizar como archivos de texto sin volver a compilar el proyecto. De lo contrario, el marcado HTML para las páginas y los controles de usuario se elimina y se compila en la salida del ensamblado.

Emitir información de depuración - Esta configuración corresponde a la opción -d del comando aspnet_compiler.exe.

No fusionar - Esta configuración no ejecuta aspnet_merge.exe y no utiliza la opción -fixednames del comando aspnet_compiler.exe.

No se fusionen. Cree un ensamblaje separado para cada página y control - Esta configuración no ejecuta aspnet_merge.exe. En su lugar, utiliza la opción -fixednames del comando aspnet_compiler.exe. Esta opción es útil si desea realizar actualizaciones granulares de su sitio web implementado. Sin embargo, compilar con la opción -fixednames deshabilita las optimizaciones por lotes del compilador y puede resultar en tiempos de compilación más largos para sitios web grandes.

Fusionar todas las salidas en un solo ensamblaje - Esta configuración es equivalente a la opción -o nombre de ensamblaje del comando aspnet_merge.exe.

Tratar como componente de biblioteca (eliminar el archivo App_Code.compiled) - Esta configuración corresponde a la opción -r del comando aspnet_merge.exe. Seleccionar esta opción permite que el ensamblado App_Code.dll del proyecto se agregue a la carpeta Bin de otro sitio web sin entrar en conflicto con el ensamblado App_Code.dll en el otro sitio web. Esto es útil para construir una biblioteca de controles .ascx

Fusionar la salida de cada carpeta individual en su propio ensamblaje - Esta configuración corresponde a la opción -prefix prefixname del comando aspnet_merge.exe. Esta opción le permite actualizar su sitio web a nivel de carpeta en lugar de actualizar toda la aplicación. Puede utilizar el cuadro Prefijo de ensamblado opcional para especificar un prefijo que se agregará al principio de todos los nombres de ensamblajes generados. Por ejemplo, si especifica el prefijo MyCompany, el nombre se convierte en MyCompany.SubfolderName.

Fusionar todas las páginas y salidas de control en un solo ensamblaje - Esta configuración corresponde a la opción –w nombre de ensamblaje del comando aspnet_merge.exe. Esta opción le permite actualizar los elementos de la interfaz de usuario por separado de la actualización de otro código. Las carpetas especiales, como App_Code, App_WebReferences, etc., se compilan en un ensamblado independiente. Especifique el nombre del ensamblado de destino en el cuadro Nombre del ensamblado.

Intente seguir los pasos.

1. Cambie la configuración de la solución al modo de liberación.

2. Asegúrese de que web.config se esté publicando.

3. Verifique las propiedades del archivo web.config y vea si Acción de compilación está configurada en Ninguno. Si es así, configúrelo en Contenido. y vuelva a ejecutar el comando.

4. Cambie DashBoard.Precomiled.dll a DashBoard.Precomiled only.

5. Marque también la casilla de verificación Tratar como componente de biblioteca.

Para obtener más detalles sobre las opciones, visite la herramienta de compilación ASP.NET (Aspnet_compiler.exe)

Gracias

Te mostramos comentarios y calificaciones

Si te gustó nuestro trabajo, tienes la habilidad dejar una crónica acerca de qué te ha gustado de esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *