Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión de .NET 9 de este artículo.
Advertencia
Esta versión de ASP.NET Core ya no se admite. Para más información, consulte la directiva de soporte técnico de .NET y .NET Core. Para la versión actual, consulte la versión de .NET 9 de este artículo.
Importante
Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Para la versión actual, consulte la versión de .NET 9 de este artículo.
En este artículo se explica cómo hospedar e implementar aplicaciones de Blazor WebAssembly.
Con el Blazor WebAssembly modelo de hospedaje:
- La aplicación Blazor, sus dependencias y el entorno de ejecución de .NET se descargan en el explorador en paralelo.
- La aplicación se ejecuta directamente en el subproceso de interfaz de usuario del explorador.
Este artículo pertenece al escenario de implementación donde la aplicación Blazor se coloca en un servidor o servicio web de hospedaje estático; .NET no se usa para suministrar la aplicación Blazor. Esta estrategia se trata en la sección implementación Standalone y en otros artículos de este nodo para IIS, servicios Azure, Apache, Nginx y GitHub Pages.
Se admiten las estrategias de implementación siguientes:
- La aplicación Blazor está gestionada por una aplicación ASP.NET Core. Esta estrategia se trata en la sección Implementación hospedada con ASP.NET Core.
- La aplicación Blazor se coloca en un servicio o servidor web de hospedaje estático, donde no se usa .NET para suministrar la aplicación Blazor. Esta estrategia se trata en la sección Implementación independiente, que incluye información sobre cómo hospedar una aplicación Blazor WebAssembly como una subaplicación de IIS.
- Una aplicación de ASP.NET Core hospeda varias aplicaciones Blazor WebAssembly. Para más información, consulte Varias aplicaciones de ASP.NET Core Blazor WebAssembly hospedadas.
Hospedaje de subdominios y subaplicaciones de IIS
El hospedaje de subdominios no requiere una configuración especial de la aplicación.
No es necesario configurar la ruta de acceso base de la aplicación (la etiqueta <base>
en wwwroot/index.html
) para hospedar la aplicación en un subdominio.
El hospedaje de sub-aplicaciones en IIS requiere que usted establezca la ruta base de la aplicación. Para obtener más información y vínculos cruzados para obtener instrucciones adicionales sobre el hospedaje de aplicaciones secundarias de IIS, consulte Hospedaje e implementación de ASP.NET Core Blazor.
Reducir el tamaño máximo del montón para algunos exploradores de dispositivo móvil
Al compilar una aplicación Blazor que se ejecuta en el cliente (proyecto .Client
de una app Blazor Web App o Blazor WebAssembly independiente) y tiene como destino exploradores de dispositivos móviles, especialmente Safari en iOS, la disminución de la memoria máxima de la aplicación con la propiedad MSBuild EmccMaximumHeapSize
puede ser necesaria. El valor predeterminado es 2 147 483 648 bytes, que puede ser demasiado grande y provocar el bloqueo de la aplicación si intenta asignar más memoria y el navegador no se la concede. En el ejemplo siguiente se establece el valor en 268 435 456 bytes en el archivo Program
:
Al compilar una aplicación Blazor WebAssembly que tenga como destino exploradores de dispositivos móviles, especialmente Safari en iOS, es posible que sea necesario reducir la memoria máxima de la aplicación con la propiedad MSBuild EmccMaximumHeapSize
. El valor predeterminado es 2 147 483 648 bytes, que puede ser demasiado grande y provocar el bloqueo de la aplicación si intenta asignar más memoria y el navegador no se la concede. En el ejemplo siguiente se establece el valor en 268 435 456 bytes en el archivo Program
:
<EmccMaximumHeapSize>268435456</EmccMaximumHeapSize>
Para obtener más información sobre las propiedades y destinos de MSBuild de Mono/WebAssembly, consulte WasmApp.Common.targets
(repositorio de GitHub dotnet/runtime
).
Formato de empaquetado Webcil para ensamblados .NET
Webcil es un formato de empaquetado compatible con la web para ensamblados .NET diseñados para permitir el uso de Blazor WebAssembly en entornos de red restrictivos. Los archivos Webcil usan un contenedor WebAssembly estándar, donde los ensamblados se implementan como archivos WebAssembly que usan la extensión de archivo estándar .wasm
.
Webcil es el formato de empaquetado predeterminado al publicar una aplicación Blazor WebAssembly. Para deshabilitar el uso de Webcil, establezca la siguiente propiedad MSBuild en el archivo de proyecto de la aplicación:
<PropertyGroup>
<WasmEnableWebcil>false</WasmEnableWebcil>
</PropertyGroup>
Personalización de la carga de los recursos de arranque
Personalice la forma en que se cargan los recursos de arranque mediante la API loadBootResource
. Para obtener más información, vea Inicio de Blazor de ASP.NET Core.
Compresión
Cuando se publica una aplicación Blazor WebAssembly, la salida se comprime estáticamente durante la publicación para reducir el tamaño de la aplicación y acabar con la necesidad de compresión en tiempo de ejecución. Se usan los algoritmos de compresión siguientes:
Blazor se basa en el host para proporcionar los archivos comprimidos adecuados. Al hospedar una aplicación independiente Blazor WebAssembly, puede que sea necesario realizar trabajo adicional para garantizar que se proporcionan los archivos comprimidos estáticamente:
Blazor se basa en el host para proporcionar los archivos comprimidos adecuados. Cuando se usa un proyecto ASP.NET Core alojadoBlazor WebAssembly, el proyecto anfitrión tiene la capacidad de realizar la negociación de contenido y proporcionar los archivos comprimidos estáticamente. Al hospedar una aplicación independiente Blazor WebAssembly, puede que sea necesario realizar trabajo adicional para garantizar que se proporcionan los archivos comprimidos estáticamente:
- Para la configuración de compresión de IIS
web.config
, consulte la sección IIS: compresión Brotli y Gzip. - Al hospedar en soluciones de hospedaje estáticas que no admiten la negociación de contenido de archivos comprimidos estáticamente, considere la posibilidad de configurar la aplicación para capturar y descodificar archivos comprimidos Brotli:
Obtenga el descodificador Brotli de JavaScript del repositorio de GitHub google/brotli
. El archivo del descodificador minificado se llama decode.min.js
y se encuentra en la carpeta js
del repositorio.
Nota:
Si se produce un error en la versión minificada del script decode.js
(decode.min.js
), en su lugar, pruebe a usar la versión no minificada (decode.js
).
Actualice la aplicación para que use el descodificador.
En el archivo wwwroot/index.html
, establezca autostart
en false
en la etiqueta Blazor de <script>
:
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
Después de la etiqueta Blazor de <script>
y antes de la etiqueta de cierre </body>
, agregue el siguiente bloque <script>
de código de JavaScript. La función siguiente llama a fetch
con cache: 'no-cache'
para mantener actualizada la memoria caché del explorador.
Blazor Web App:
<script type="module">
import { BrotliDecode } from './decode.min.js';
Blazor.start({
webAssembly: {
loadBootResource: function (type, name, defaultUri, integrity) {
if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration' && type !== 'manifest') {
return (async function () {
const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
if (!response.ok) {
throw new Error(response.statusText);
}
const originalResponseBuffer = await response.arrayBuffer();
const originalResponseArray = new Int8Array(originalResponseBuffer);
const decompressedResponseArray = BrotliDecode(originalResponseArray);
const contentType = type ===
'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
return new Response(decompressedResponseArray,
{ headers: { 'content-type': contentType } });
})();
}
}
}
});
</script>
Blazor WebAssembly independiente:
<script type="module">
import { BrotliDecode } from './decode.min.js';
Blazor.start({
loadBootResource: function (type, name, defaultUri, integrity) {
if (type !== 'dotnetjs' && location.hostname !== 'localhost' && type !== 'configuration') {
return (async function () {
const response = await fetch(defaultUri + '.br', { cache: 'no-cache' });
if (!response.ok) {
throw new Error(response.statusText);
}
const originalResponseBuffer = await response.arrayBuffer();
const originalResponseArray = new Int8Array(originalResponseBuffer);
const decompressedResponseArray = BrotliDecode(originalResponseArray);
const contentType = type ===
'dotnetwasm' ? 'application/wasm' : 'application/octet-stream';
return new Response(decompressedResponseArray,
{ headers: { 'content-type': contentType } });
})();
}
}
});
</script>
Para obtener más información sobre la carga de los recursos de arranque, vea Inicio de Blazor de ASP.NET Core.
Para deshabilitar la compresión, agregue la propiedad CompressionEnabled
de MSBuild al archivo del proyecto de la aplicación y establezca el valor en false
:
<PropertyGroup>
<CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>
La propiedad CompressionEnabled
se puede pasar al comando dotnet publish
con la sintaxis siguiente en un shell de comandos:
dotnet publish -p:CompressionEnabled=false
Para deshabilitar la compresión, agregue la propiedad BlazorEnableCompression
de MSBuild al archivo del proyecto de la aplicación y establezca el valor en false
:
<PropertyGroup>
<BlazorEnableCompression>false</BlazorEnableCompression>
</PropertyGroup>
La propiedad BlazorEnableCompression
se puede pasar al comando dotnet publish
con la sintaxis siguiente en un shell de comandos:
dotnet publish -p:BlazorEnableCompression=false
Reescritura de las URL para conseguir un enrutamiento correcto
Enrutar las solicitudes de los componentes de página de una aplicación Blazor WebAssembly no es tan sencillo como enrutar las solicitudes de una aplicación Blazor Server. Imagine que tiene una aplicación Blazor WebAssembly con dos componentes:
-
Main.razor
: se carga en la raíz de la aplicación y contiene un vínculo al componenteAbout
(href="About"
). -
About.razor
: componenteAbout
.
Cuando se solicita el documento predeterminado de la aplicación mediante la barra de direcciones del explorador (por ejemplo, https://www.contoso.com/
):
- El explorador realiza una solicitud.
- Se devuelve la página predeterminada, que suele ser
index.html
. -
index.html
inicializa la aplicación. -
Router carga el componente y se representa el componente Razor
Main
.
En la página principal, la selección del vínculo al componente About
funciona en el cliente porque el enrutador de Blazor impide que el explorador haga una solicitud en Internet a www.contoso.com
sobre About
y presenta el propio componente About
representado. Todas las solicitudes de puntos de conexión internos dentro de la aplicación Blazor WebAssembly funcionan del mismo modo: Las solicitudes no desencadenan solicitudes basadas en el explorador a recursos hospedados en el servidor en Internet. El enrutador controla las solicitudes de forma interna.
Si se realiza una solicitud mediante la barra de direcciones del explorador para www.contoso.com/About
, se produce un error. Este recurso no existe en el host de Internet de la aplicación, por lo que se devuelve una respuesta 404 No encontrado.
Dado que los exploradores solicitan páginas del lado cliente a hosts basados en Internet, los servidores web y los servicios de hospedaje deben reescribir todas las solicitudes de recursos que no estén físicamente en el servidor a la página index.html
. Cuando se devuelve index.html
, el enrutador Blazor de la aplicación se hace cargo y responde con el recurso correcto.
Al implementar en un servidor IIS, puede usar el módulo URL Rewrite con el archivo web.config
publicado de la aplicación. Para más información, vea Hospedaje e implementación de ASP.NET Core Blazor WebAssembly con ISS.
Implementación hospedada con ASP.NET Core
Una implementación hospedada se encarga de suministrar la aplicación Blazor WebAssembly a los exploradores desde una aplicación ASP.NET Core que se ejecuta en un servidor web.
La aplicación cliente de Blazor WebAssembly se publica en la carpeta /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot
de la aplicación de servidor, junto con cualquier otro recurso web estático de la aplicación de servidor. Las dos aplicaciones se implementan juntas. Se requiere un servidor web que pueda hospedar una aplicación ASP.NET Core. En el caso de una implementación hospedada, Visual Studio incluye la plantilla de proyecto Aplicación de Blazor WebAssembly (plantilla blazorwasm
si se usa el comando dotnet new
) con la opción Hosted
seleccionada (-ho|--hosted
si se usa el comando dotnet new
).
Para obtener más información, consulte los artículos siguientes:
- Implementación y hospedaje de aplicaciones de ASP.NET Core: Implementación y hospedaje de ASP.NET Core
- Implementación en Azure App Service: Publicar una aplicación de ASP.NET Core en Azure con Visual Studio
- Plantillas de proyectos Blazor: Estructura de proyectos Blazor de ASP.NET Core
Despliegue hospedado de un ejecutable dependiente de un marco para una plataforma específica
Para implementar una aplicación Blazor WebAssembly hospedada como un ejecutable dependiente del marco para una plataforma específica (no independiente), sigue estas instrucciones basadas en las herramientas que se usan.
Visual Studio
Se configura una implementación independiente para un perfil de publicación generado (.pubxml
). Comprueba que el perfil de publicación del proyecto Server contiene la <SelfContained>
propiedad MSBuild establecida en false
.
En el archivo de perfil de publicación .pubxml
de la carpeta Server del proyecto Properties
:
<SelfContained>false</SelfContained>
Establece el identificador de tiempo de ejecución (RID) mediante el valor de Tiempo de ejecución de destino en el área Configuración de la interfaz de usuario de Publicación, que genera la propiedad MSBuild <RuntimeIdentifier>
en el perfil de publicación:
<RuntimeIdentifier>{RID}</RuntimeIdentifier>
En la configuración anterior, el marcador de posición {RID}
es el identificador de tiempo de ejecución (RID).
Publique el proyecto Server en la configuración de Versión.
Nota:
Es posible publicar una aplicación con la configuración del perfil de publicación mediante la CLI de .NET pasando /p:PublishProfile={PROFILE}
al comando dotnet publish
, donde el marcador de posición {PROFILE}
es el perfil. Para obtener más información, consulta las secciones Publicar los perfiles y Ejemplo de publicación de carpetas en el artículo Perfiles de publicación (.pubxml) de Visual Studio para la implementación de aplicaciones ASP.NET Core. Si pasa el RID en el comando dotnet publish
y no en el perfil de publicación, use la propiedad MSBuild (/p:RuntimeIdentifier
) con el comando, no con la opción -r|--runtime
.
CLI de .NET
Configura una implementación independiente colocando la propiedad MSBuild <SelfContained>
en un <PropertyGroup>
en el archivo de proyecto del proyecto Server establecido en false
:
<SelfContained>false</SelfContained>
Importante
La propiedad SelfContained
debe colocarse en el archivo de proyecto del proyecto Server. La propiedad no se puede establecer correctamente con el comando dotnet publish
mediante la opción --no-self-contained
o la propiedad MSBuild /p:SelfContained=false
.
Establece el identificador en tiempo de ejecución (RID) mediante cualquiera de los métodos siguientes:
Opción 1: Establece el RID en un
<PropertyGroup>
en el archivo de proyecto del proyecto Server:<RuntimeIdentifier>{RID}</RuntimeIdentifier>
En la configuración anterior, el marcador de posición
{RID}
es el identificador de tiempo de ejecución (RID).Publica la aplicación en la configuración de versión del proyecto Server:
dotnet publish -c Release
Opción 2: Pase el RID en el comando
dotnet publish
como la propiedad de MSBuild (/p:RuntimeIdentifier
), no con la opción-r|--runtime
:dotnet publish -c Release /p:RuntimeIdentifier={RID}
En el comando anterior, el marcador de posición
{RID}
es el identificador de tiempo de ejecución (RID).
Para obtener más información, consulte los artículos siguientes:
Implementación independiente
Una implementación independiente suministra la aplicación Blazor WebAssembly como un conjunto de archivos estáticos que los clientes solicitan directamente. Cualquier servidor de archivos estático es capaz de suministrar la aplicación Blazor.
Los recursos de implementación independientes se publican en la carpeta /bin/Release/{TARGET FRAMEWORK}/publish/wwwroot
o bin/Release/{TARGET FRAMEWORK}/browser-wasm/publish
, donde el marcador de posición {TARGET FRAMEWORK}
es la plataforma de destino.
Azure App Service
Las aplicaciones Blazor WebAssembly se pueden implementar en Azure App Services en Windows, que hospeda la aplicación en IIS.
Actualmente no se admite la implementación de una aplicación Blazor WebAssembly independiente en Azure App Service para Linux. Se recomienda hospedar una aplicación independiente Blazor WebAssembly mediante Azure Static Web Apps, que admite este escenario.
Independiente con Docker
Una aplicación independiente Blazor WebAssembly se publica como un conjunto de archivos estáticos que hospeda un servidor de archivos estáticos.
Para hospedar la aplicación en Docker:
- Elija un contenedor de Docker con compatibilidad con el servidor web, como Nginx o Apache.
- Copie los recursos de la carpeta
publish
en una carpeta de ubicación definida en el servidor web para atender archivos estáticos. - Aplique la configuración adicional según sea necesario para atender la aplicación Blazor WebAssembly.
Para obtener orientación sobre la configuración, consulte los siguientes recursos:
- Artículos Nginx o Apache
- Documentación de Docker.
Valores de configuración de host
Las aplicaciones Blazor WebAssembly pueden aceptar los siguientes valores de configuración de host como argumentos de línea de comandos en tiempo de ejecución en el entorno de desarrollo.
Raíz del contenido
El argumento --contentroot
establece la ruta de acceso absoluta al directorio que incluye los archivos de contenido de la aplicación (raíz del contenido). En los ejemplos siguientes, /content-root-path
es la ruta de acceso raíz del contenido de la aplicación.
Pase el argumento al ejecutar la aplicación de forma local en un símbolo del sistema. En el directorio de la aplicación, ejecute lo siguiente:
dotnet watch --contentroot=/content-root-path
Agregue una entrada al archivo
launchSettings.json
de la aplicación en el perfil IIS Express. Esta configuración se utiliza cuando se ejecuta la aplicación mediante el depurador de Visual Studio y desde una línea de comandos condotnet watch
(odotnet run
)."commandLineArgs": "--contentroot=/content-root-path"
En Visual Studio, especifique el argumento en Propiedades>Depuración>Argumentos de la aplicación. Al establecer el argumento en la página de propiedades de Visual Studio, se agrega el argumento al archivo
launchSettings.json
.--contentroot=/content-root-path
Ruta de acceso base
El argumento --pathbase
establece la ruta de acceso base de la aplicación para una aplicación que se ejecuta localmente con una ruta de acceso de URL relativa que no es raíz (el valor <base>
de la etiqueta href
se establece en una ruta de acceso que no sea /
para ensayo y producción). En los ejemplos siguientes, /relative-URL-path
es la ruta de acceso base de la aplicación. Para obtener más información, consulte ASP.NET Core Blazor app base path.
Importante
A diferencia de la ruta de acceso proporcionada al valor href
de la etiqueta <base>
, no incluya una barra diagonal final (/
) al pasar el valor del argumento --pathbase
. Si se proporciona la ruta de acceso base de la aplicación en la etiqueta <base>
como <base href="/CoolApp/">
(se incluye una barra diagonal final), se pasa el valor del argumento de línea de comandos como --pathbase=/CoolApp
(sin barra diagonal final).
Pase el argumento al ejecutar la aplicación de forma local en un símbolo del sistema. En el directorio de la aplicación, ejecute lo siguiente:
dotnet watch --pathbase=/relative-URL-path
Agregue una entrada al archivo
launchSettings.json
de la aplicación en el perfil IIS Express. Esta configuración se utiliza al ejecutar la aplicación usando el depurador de Visual Studio y desde una línea de comandos condotnet watch
(odotnet run
)."commandLineArgs": "--pathbase=/relative-URL-path"
En Visual Studio, especifique el argumento en Propiedades>Depuración>Argumentos de la aplicación. Al establecer el argumento en la página de propiedades de Visual Studio, se agrega el argumento al archivo
launchSettings.json
.--pathbase=/relative-URL-path
Para obtener más información, consulte ASP.NET Core Blazor app base path.
Direcciones web URL
El argumento --urls
establece las direcciones IP o de host junto con los puertos y protocolos en los que se deben recibir las solicitudes.
Pase el argumento al ejecutar la aplicación de forma local en un símbolo del sistema. En el directorio de la aplicación, ejecute lo siguiente:
dotnet watch --urls=http://127.0.0.1:0
Agregue una entrada al archivo
launchSettings.json
de la aplicación en el perfil IIS Express. Esta configuración se utiliza al ejecutar la aplicación usando el depurador de Visual Studio y desde una línea de comandos condotnet watch
(odotnet run
)."commandLineArgs": "--urls=http://127.0.0.1:0"
En Visual Studio, especifique el argumento en Propiedades>Depuración>Argumentos de la aplicación. Al establecer el argumento en la página de propiedades de Visual Studio, se agrega el argumento al archivo
launchSettings.json
.--urls=http://127.0.0.1:0
Configurar el recortador
Blazor realiza el recorte de lenguaje intermedio (IL) en cada compilación de lanzamiento para quitar el IL innecesario de los ensamblados de salida. Para más información, vea Configuración del recortador de ASP.NET Core Blazor.
Configurar el enlazador
Blazor realiza la vinculación de lenguaje intermedio (IL) en cada compilación de lanzamiento para quitar el IL innecesario de los ensamblados de salida. Para obtener más información, consulta Configuración del enlazador de ASP.NET Core Blazor.
Cambio de la extensión de nombre de archivo de los archivos DLL
Esta sección se aplica a .NET 5 a .NET 7. En .NET 8 o posterior, los ensamblados de .NET se implementan como archivos WebAssembly (.wasm
) mediante el formato de archivo webcil.
Si un firewall, un programa antivirus o un dispositivo de seguridad de red bloquea la trasmisión de los archivos de la biblioteca de vínculos dinámicos (DLL) de la aplicación (.dll
), puedes seguir las instrucciones de esta sección para cambiar las extensiones de nombre de archivo de los archivos DLL publicados de la aplicación.
Cambiar las extensiones de nombre de archivo de los archivos DLL de la aplicación quizá no resuelva el problema porque muchos sistemas de seguridad examinan el contenido de los archivos de la aplicación, no solo comprueban las extensiones de archivo.
Para obtener un enfoque más sólido en entornos que bloquean la descarga y ejecución de archivos DLL, toma cualquiera de los enfoques siguientes:
- Usa .NET 8 o posterior, que empaqueta ensamblados de .NET como archivos WebAssembly (
.wasm
) mediante el formato de archivo Webcil. Para obtener más información, consulte la sección Formato de empaquetado de webcil para ensamblados de .NET en este artículo, correspondiente a .NET 8 o una versión posterior. - En .NET 6 o posterior, use un diseño de implementación personalizado.
Existen enfoques de terceros para tratar este problema. Para obtener más información, consulta los recursos en Awesome Blazor.
Después de publicar la aplicación, usa un script de shell o una canalización de compilación de DevOps para cambiar el nombre de los archivos .dll
a fin de usar otra extensión de archivo en el directorio de la salida publicada de la aplicación.
En los siguientes ejemplos:
- PowerShell (PS) se usa para actualizar las extensiones de archivo.
- Los archivos
.dll
cambian de nombre para usar la extensión de archivo.bin
de la línea de comandos. - Los archivos que aparecen en el manifiesto de arranque publicado Blazor con una extensión de archivo
.dll
se actualizan a la extensión de archivo.bin
. - Si los recursos de trabajo de servicio también están en uso, un comando de PowerShell actualiza los archivos
.dll
enumerados en el archivoservice-worker-assets.js
a la extensión de archivo.bin
.
Para usar una extensión de archivo distinta de .bin
, reemplace .bin
en los siguientes comandos por la extensión de archivo deseada.
En los siguientes comandos, el marcador de posición {PATH}
representa la ruta de acceso a la carpeta _framework
publicada en la carpeta publish
.
Cambie el nombre de las extensiones de archivo en la carpeta:
dir {PATH} | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
Cambie el nombre de las extensiones de archivo en el blazor.boot.json
archivo:
((Get-Content {PATH}\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\blazor.boot.json
Si también se utilizan activos de service worker porque la app es una Progressive Web App (PWA):
((Get-Content {PATH}\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content {PATH}\service-worker-assets.js
En el comando anterior, el marcador de posición {PATH}
es la ruta de acceso al archivo service-worker-assets.js
publicado.
Para abordar el archivo comprimido blazor.boot.json
, adopte cualquiera de los enfoques siguientes:
- Vuelva a comprimir el archivo actualizado
blazor.boot.json
, generando archivos nuevosblazor.boot.json.gz
yblazor.boot.json.br
. (Recomendado) - Quita los archivos comprimidos
blazor.boot.json.gz
yblazor.boot.json.br
. (La compresión está deshabilitada con este enfoque).
Para el archivo comprimido de una service-worker-assets.js
adopte cualquiera de los enfoques siguientes:
- Vuelva a comprimir el archivo actualizado
service-worker-assets.js
, generando archivos nuevosservice-worker-assets.js.br
yservice-worker-assets.js.gz
. (Recomendado) - Quita los archivos comprimidos
service-worker-assets.js.gz
yservice-worker-assets.js.br
. (La compresión está deshabilitada con este enfoque).
Para automatizar el cambio de extensión en Windows en .NET 6/7, el siguiente enfoque usa un script de PowerShell colocado en la raíz del proyecto. El siguiente script, que deshabilita la compresión, es la base para una modificación adicional si desea volver a comprimir el archivo blazor.boot.json
y el archivo service-worker-assets.js
si la aplicación es una Aplicación Web Progresiva (PWA). La ruta de acceso a la publish
carpeta se pasa al script cuando se ejecuta.
ChangeDLLExtensions.ps1:
:
param([string]$filepath)
dir $filepath\wwwroot\_framework | rename-item -NewName { $_.name -replace ".dll\b",".bin" }
((Get-Content $filepath\wwwroot\_framework\blazor.boot.json -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\_framework\blazor.boot.json
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.gz
Remove-Item $filepath\wwwroot\_framework\blazor.boot.json.br
Si también se utilizan activos de service worker porque la aplicación es una Progressive Web App (PWA), añada los siguientes comandos:
((Get-Content $filepath\wwwroot\service-worker-assets.js -Raw) -replace '.dll"','.bin"') | Set-Content $filepath\wwwroot\service-worker-assets.js
Remove-Item $filepath\wwwroot\service-worker-assets.js.gz
Remove-Item $filepath\wwwroot\service-worker-assets.js.br
En el archivo del proyecto, el script se ejecuta después de publicar la aplicación con la configuración de Release
:
<Target Name="ChangeDLLFileExtensions" AfterTargets="AfterPublish" Condition="'$(Configuration)'=='Release'">
<Exec Command="powershell.exe -command "& {.\ChangeDLLExtensions.ps1 '$(SolutionDir)'}"" />
</Target>
Después de publicar la aplicación, vuelva a comprimir blazor.boot.json
manualmente y service-worker-assets.js
, si está en uso, para volver a habilitar la compresión.
Nota:
Al cambiar el nombre y realizar la carga diferida de los mismos ensamblados, vea las instrucciones de Ensamblados de carga diferida en Blazor WebAssembly de ASP.NET Core.
Normalmente, el servidor de la aplicación requiere la configuración de recursos estáticos para servir los archivos con la extensión actualizada. Para una aplicación hospedada por IIS, agregue una entrada de asignación MIME (<mimeMap>
) para la nueva extensión de archivo en la sección de contenido estático (<staticContent>
) de un archivo web.config
personalizado. En el ejemplo siguiente se supone que la extensión de archivo se cambia de .dll
a .bin
:
<staticContent>
...
<mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
...
</staticContent>
Incluya una actualización para los archivos comprimidos si se usa compresión:
<mimeMap fileExtension=".bin.br" mimeType="application/octet-stream" />
<mimeMap fileExtension=".bin.gz" mimeType="application/octet-stream" />
Quite la entrada de la extensión de archivo .dll
:
- <mimeMap fileExtension=".dll" mimeType="application/octet-stream" />
Quite las entradas de los archivos .dll
comprimidos si se usa compresión:
- <mimeMap fileExtension=".dll.br" mimeType="application/octet-stream" />
- <mimeMap fileExtension=".dll.gz" mimeType="application/octet-stream" />
Para obtener más información sobre los archivos personalizados web.config
, consulte la sección Uso de una web.config
personalizada.
Corrupción en el despliegue anterior
Normalmente, en la implementación:
- Solo se reemplazan los archivos que han cambiado, lo que normalmente da lugar a una implementación más rápida.
- Los archivos existentes que no forman parte de la nueva implementación se dejan en su lugar para ser usados por la nueva implementación.
En raras ocasiones, los archivos persistentes de una implementación anterior pueden dañar una nueva implementación. La eliminación completa de la implementación existente (o la aplicación publicada localmente antes de la implementación) puede resolver el problema con una implementación dañada. A menudo, la eliminación de la implementación existente una vez es suficiente para resolver el problema, incluidos los DevOps compilación e implementación de la canalización.
Si determina que siempre es necesario borrar una implementación anterior cuando se está utilizando una canalización de compilación e implementación de DevOps, puede agregar temporalmente un paso a la canalización de compilación para eliminar la implementación anterior de cada nueva implementación hasta que solucione la causa exacta de los daños.