Depuración de Blazor WebAssembly en ASP.NET Core

Las aplicaciones Blazor WebAssembly se pueden depurar con las herramientas de desarrollo del explorador en exploradores basados en Chromium (Edge/Chrome). También puede depurar la aplicación con los siguientes entornos de desarrollo integrado (IDE):

  • Visual Studio
  • Visual Studio para Mac
  • Visual Studio Code

Entre los escenarios disponibles se incluyen los siguientes:

  • Establecimiento y eliminación de puntos de interrupción.
  • Ejecute la aplicación con compatibilidad de depuración en IDE.
  • Examine el código en un solo paso.
  • Reanude la ejecución de código con un método abreviado de teclado en IDE.
  • En la ventana Variables locales, observe los valores de las variables locales.
  • Vea la pila de llamadas, incluidas las cadenas de llamadas entre JavaScript y .NET.

Por ahora, no puede:

  • Interrumpir las operaciones ante excepciones no controladas.
  • Alcanzar puntos de interrupción durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.
  • Depure en escenarios no locales; por ejemplo, el Subsistema de Windows para Linux (WSL) o Visual Studio Codespaces.
  • Recompile automáticamente la aplicación Server de back-end de una solución Blazor WebAssembly hospedada durante la depuración, por ejemplo, mediante la ejecución de la aplicación con dotnet watch run.

Requisitos previos

La depuración requiere cualquiera de los exploradores siguientes:

  • Google Chrome (versión 70 o posterior) (predeterminado)
  • Microsoft Edge (versión 80 o posterior)

Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Los usuarios de Visual Studio Code requieren las siguientes extensiones:

Después de abrir un proyecto en VS Code, puede recibir una notificación en la que se indique que se requiere una configuración adicional para habilitar la depuración. Instale las extensiones necesarias de Visual Studio Marketplace, si se le solicita que lo haga. Para inspeccionar las extensiones instaladas, abra Ver > Extensiones en la barra de menús o seleccione el icono Extensiones en la barra lateral Actividad.

Visual Studio para Mac requiere la versión 8.8 (compilación 1532) o una posterior:

  1. Instale la versión más reciente de Visual Studio para Mac seleccionando el botón Descargar Visual Studio para Mac en Microsoft: Visual Studio para Mac.
  2. Seleccione el canal Vista preliminar en Visual Studio. Para obtener más información, vea Instalación de la versión más reciente de Visual Studio para Mac.

Nota

Apple Safari en macOS no se admite actualmente.

Depuración de una aplicación Blazor WebAssembly independiente

Para habilitar la depuración de una aplicación Blazor WebAssembly, actualice el archivo launchSettings.json del proyecto de inicio para incluir la propiedad inspectUri siguiente en cada perfil de inicio:

"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"

Una vez que lo actualice, el archivo launchSettings.json debe ser similar a este ejemplo:

{
    "iisSettings": {
      "windowsAuthentication": false,
      "anonymousAuthentication": true,
      "iisExpress": {
        "applicationUrl": "http://localhost:50454",
        "sslPort": 44399
      }
    },
    "profiles": {
      "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      },
      "BlazorApp1.Server": {
        "commandName": "Project",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "applicationUrl": "https://localhost:5001;http://localhost:5000",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      }
    }
  }

La propiedad inspectUri:

  • Permite que el IDE detecte que la aplicación es una aplicación Blazor WebAssembly.
  • Indica a la infraestructura de depuración de scripts que se conecte al explorador a través del proxy de depuración de Blazor.

El marco de trabajo proporciona los valores de marcador de posición para el protocolo WebSocket (wsProtocol), el host (url.hostname), el puerto (url.port) y el identificador URI del inspector en el explorador iniciado (browserInspectUri).

Para depurar una aplicación Blazor WebAssembly en Visual Studio:

  1. Cree una nueva solución de Blazor WebAssembly hospedada.

  2. Con el proyecto Server seleccionado en el Explorador de soluciones, presione F5 para ejecutar la aplicación en el depurador.

    Nota

    Al realizar una depuración con un explorador basado en Chromium, como Google Chrome o Microsoft Edge, puede que se abra una nueva ventana del navegador con un perfil distinto para la sesión de depuración, en vez de abrir una pestaña en una ventana existente con el perfil del usuario. Si la depuración con el perfil del usuario es un requisito, adopte uno de estos enfoques:

    Nota

    No admite Iniciar sin depuración (Ctrl+F5). Cuando la aplicación se ejecuta en la configuración de depuración, la sobrecarga de depuración siempre genera una pequeña reducción del rendimiento.

  3. En la aplicación *Client*, establezca un punto de interrupción en la línea currentCount++; en Pages/Counter.razor.

  4. En el explorador, vaya a la página Counter y seleccione el botón Hacer clic aquí para alcanzar el punto de interrupción.

  5. En Visual Studio, revise el valor del campo currentCount en la ventana Variables locales.

  6. Presione F5 para continuar la ejecución.

Al depurar una aplicación de Blazor WebAssembly, también puede depurar el código del servidor:

  1. Establezca un punto de interrupción en la página Pages/FetchData.razor de OnInitializedAsync.
  2. Establezca un punto de interrupción en WeatherForecastController en el método de acción Get.
  3. Vaya a la página Fetch Data para alcanzar el primer punto de interrupción en el componente FetchData justo antes de que emita una solicitud HTTP al servidor.
  4. Presione F5 para continuar la ejecución y, luego, alcance el punto de interrupción en el servidor en WeatherForecastController.
  5. Vuelva a presionar F5 para permitir que la ejecución continúe y ver la tabla de pronóstico meteorológico representada en el explorador.

Nota

Los puntos de interrupción no se alcanzan durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.

Si la aplicación se hospeda en una ruta de acceso base de la aplicación distinta de /, actualice las propiedades siguientes en Properties/launchSettings.json para reflejar la ruta de acceso base de la aplicación:

  • applicationUrl:

    "iisSettings": {
      ...
      "iisExpress": {
        "applicationUrl": "http://localhost:{INSECURE PORT}/{APP BASE PATH}/",
        "sslPort": {SECURE PORT}
      }
    },
    
  • inspectUri de cada perfil:

    "profiles": {
      ...
      "{PROFILE 1, 2, ... N}": {
        ...
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/{APP BASE PATH}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        ...
      }
    }
    

Los marcadores de posición en la configuración anterior:

  • {INSECURE PORT}: puerto no seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {APP BASE PATH}: ruta de acceso base de la aplicación.
  • {SECURE PORT}: puerto seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {PROFILE 1, 2, ... N}: perfiles de configuración de inicio. Normalmente, una aplicación especifica más de un perfil de forma predeterminada (por ejemplo, un perfil para IIS Express y un perfil de proyecto, que se usa en el servidor de Kestrel).

En los ejemplos siguientes, la aplicación se hospeda en /OAT con una ruta de acceso base de la aplicación configurada en wwwroot/index.html como <base href="/OAT/">:

"applicationUrl": "http://localhost:{INSECURE PORT}/OAT/",
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/OAT/_framework/debug/ws-proxy?browser={browserInspectUri}",

Para obtener información sobre el uso de una ruta de acceso base de la aplicación personalizada para las aplicaciones de Blazor WebAssembly, vea Hospedaje e implementación de ASP.NET Core Blazor.

Depuración en el explorador

La guía de esta sección se aplica a Google Chrome y Microsoft Edge en Windows.

  1. Ejecute una compilación de depuración de la aplicación en el entorno de desarrollo.

  2. Inicie un explorador y vaya a la dirección URL de la aplicación (por ejemplo, https://localhost:7268).

  3. En el explorador, intente iniciar la depuración remota; para ello, presione Mayús+Alt+D.

    El explorador debe ejecutarse con la depuración remota habilitada, lo cual no es el valor predeterminado. Si la depuración remota está deshabilitada, aparece una página de error que informa de que no se puede encontrar la pestaña del explorador depurable con instrucciones para iniciar el explorador con el puerto de depuración abierto. Siga las instrucciones del explorador, que abre una nueva ventana del explorador. Cierre la ventana anterior del explorador.

  1. Una vez que el explorador se ejecute con la depuración remota habilitada, el método abreviado de teclado de depuración del paso anterior abre una nueva pestaña del depurador.

  2. Tras unos instantes, en la pestaña Orígenes se mostrará una lista de los ensamblados .NET de la aplicación en el nodo file://.

  3. En el código de componente (archivos .razor) y los archivos de código de C# (.cs), se alcanzan los puntos de interrupción establecidos cuando se ejecuta el código. Una vez que se haya alcanzado un punto de interrupción, examine el código una vez (F10) o reanude (F8) la ejecución del código con normalidad.

Blazor proporciona un proxy de depuración que implementa el protocolo Chrome DevTools y aumenta el protocolo con información específica de .NET. Cuando se presiona el método abreviado de teclado de depuración, Blazor apunta a Chrome DevTools en el proxy. El proxy se conecta a la ventana del explorador que se quiere depurar (de ahí la necesidad de habilitar la depuración remota).

Mapas de origen del explorador

Los mapas de origen del explorador permiten al explorador volver a asignar los archivos compilados a sus archivos de código fuente originales y se suelen usar para la depuración del lado cliente. Sin embargo, en la actualidad Blazor no asigna C# directamente a JavaScript o WASM. En su lugar, Blazor realiza la interpretación de IL en el explorador, por lo que los mapas de origen no son pertinentes.

Configuración de firewall

Si un firewall bloquea la comunicación con el proxy de depuración, cree una regla de excepción de firewall que permita la comunicación entre el explorador y el proceso NodeJS.

Advertencia

La modificación de una configuración de firewall debe realizarse con cuidado para evitar la creación de vulnerabilidades de seguridad. Aplique con cuidado las instrucciones de seguridad, siga las recomendaciones de seguridad y respete las advertencias realizadas por el fabricante del firewall.

Permitir la comunicación abierta con el proceso NodeJS:

  • Abre el servidor de Node en cualquier conexión, en función de la configuración y las funcionalidades del firewall.
  • Podría ser arriesgado en función de la red.
  • Solo se recomienda en los equipos de los desarrolladores.

Si es posible, permita solo la comunicación abierta con el proceso NodeJS en redes privadas o de confianza.

Para obtener instrucciones de configuración del Firewall de Windows, vea Crear una regla de programa o servicio de entrada. Para más información, vea Firewall de Windows Defender con seguridad avanzada y los artículos relacionados en la serie de documentos sobre el Firewall de Windows.

Solucionar problemas

Si se encuentra con errores, las sugerencias siguientes pueden ser útiles:

  • En la pestaña Depurador, abra las herramientas para desarrolladores en el explorador. En la consola, ejecute localStorage.clear() para quitar los puntos de interrupción.
  • Confirme que instaló el certificado de desarrollo HTTPS de ASP.NET Core y que es de confianza. Para obtener más información, vea Aplicación de HTTPS en ASP.NET Core.
  • Visual Studio requiere la opción Habilitar depuración de JavaScript para ASP.NET (IE, Edge y Chrome) , en Herramientas > Opciones > Depuración > General. Es el valor predeterminado para Visual Studio. Si la depuración no funciona, confirme que la opción está seleccionada.
  • Si su entorno usa un proxy HTTP, asegúrese de que localhost esté incluido en la configuración de omisión del proxy. Esto puede hacerse al establecer la variable de entorno NO_PROXY en alguna de las siguientes opciones:
    • Archivo launchSettings.json del proyecto.
    • En el nivel de usuario o de entorno del sistema para que se aplique a todas las aplicaciones. Si usa una variable de entorno, reinicie Visual Studio para que el cambio surta efecto.
  • Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Puntos de interrupción de OnInitialized{Async} no ejecutados

El proxy de depuración del marco de Blazor tarda poco tiempo en iniciarse, por lo que es posible que no se ejecuten los puntos de interrupción en los métodos de ciclo de vida OnInitialized{Async}. Se recomienda agregar un retraso al principio del cuerpo del método para dar al proxy de depuración un tiempo para que se inicie antes de que se ejecute el punto de interrupción. Puede incluir el retraso según una directiva de compilador if para asegurarse de que el retraso no está presente en una compilación de versión de la aplicación.

OnInitialized:

protected override void OnInitialized()
{
#if DEBUG
    Thread.Sleep(10000);
#endif

    ...
}

OnInitializedAsync:

protected override async Task OnInitializedAsync()
{
#if DEBUG
    await Task.Delay(10000);
#endif

    ...
}

Tiempo de espera de Visual Studio (Windows)

Si Visual Studio inicia una excepción relacionada con que el adaptador de depuración no ha podido iniciarse en la que se menciona que se ha alcanzado el tiempo de espera, puede ajustar el tiempo de espera con una configuración del Registro:

VsRegEdit.exe set "<VSInstallFolder>" HKCU JSDebugger\Options\Debugging "BlazorTimeoutInMilliseconds" dword {TIMEOUT}

El marcador de posición {TIMEOUT} del comando anterior se expresa en milisegundos. Por ejemplo, un minuto se asigna como 60000.

Las aplicaciones Blazor WebAssembly se pueden depurar con las herramientas de desarrollo del explorador en exploradores basados en Chromium (Edge/Chrome). También puede depurar la aplicación con los siguientes entornos de desarrollo integrado (IDE):

  • Visual Studio
  • Visual Studio para Mac
  • Visual Studio Code

Entre los escenarios disponibles se incluyen los siguientes:

  • Establecimiento y eliminación de puntos de interrupción.
  • Ejecute la aplicación con compatibilidad de depuración en IDE.
  • Examine el código en un solo paso.
  • Reanude la ejecución de código con un método abreviado de teclado en IDE.
  • En la ventana Variables locales, observe los valores de las variables locales.
  • Vea la pila de llamadas, incluidas las cadenas de llamadas entre JavaScript y .NET.

Por ahora, no puede:

  • Interrumpir las operaciones ante excepciones no controladas.
  • Alcanzar puntos de interrupción durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.
  • Depure en escenarios no locales; por ejemplo, el Subsistema de Windows para Linux (WSL) o Visual Studio Codespaces.
  • Recompile automáticamente la aplicación *Server* de back-end de una solución Blazor WebAssembly hospedada durante la depuración, por ejemplo, mediante la ejecución de la aplicación con dotnet watch run.

Requisitos previos

La depuración requiere cualquiera de los exploradores siguientes:

  • Google Chrome (versión 70 o posterior) (predeterminado)
  • Microsoft Edge (versión 80 o posterior)

Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Los usuarios de Visual Studio Code requieren las siguientes extensiones:

Después de abrir un proyecto en VS Code, puede recibir una notificación en la que se indique que se requiere una configuración adicional para habilitar la depuración. Instale las extensiones necesarias de Visual Studio Marketplace, si se le solicita que lo haga. Para inspeccionar las extensiones instaladas, abra Ver > Extensiones en la barra de menús o seleccione el icono Extensiones en la barra lateral Actividad.

Visual Studio para Mac requiere la versión 8.8 (compilación 1532) o una posterior:

  1. Instale la versión más reciente de Visual Studio para Mac seleccionando el botón Descargar Visual Studio para Mac en Microsoft: Visual Studio para Mac.
  2. Seleccione el canal Vista preliminar en Visual Studio. Para obtener más información, vea Instalación de la versión más reciente de Visual Studio para Mac.

Nota

Apple Safari en macOS no se admite actualmente.

Depuración de una aplicación Blazor WebAssembly independiente

Para habilitar la depuración de una aplicación Blazor WebAssembly, actualice el archivo launchSettings.json del proyecto de inicio para incluir la propiedad inspectUri siguiente en cada perfil de inicio:

"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"

Una vez que lo actualice, el archivo launchSettings.json debe ser similar a este ejemplo:

{
    "iisSettings": {
      "windowsAuthentication": false,
      "anonymousAuthentication": true,
      "iisExpress": {
        "applicationUrl": "http://localhost:50454",
        "sslPort": 44399
      }
    },
    "profiles": {
      "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      },
      "BlazorApp1.Server": {
        "commandName": "Project",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "applicationUrl": "https://localhost:5001;http://localhost:5000",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      }
    }
  }

La propiedad inspectUri:

  • Permite que el IDE detecte que la aplicación es una aplicación Blazor WebAssembly.
  • Indica a la infraestructura de depuración de scripts que se conecte al explorador a través del proxy de depuración de Blazor.

El marco de trabajo proporciona los valores de marcador de posición para el protocolo WebSocket (wsProtocol), el host (url.hostname), el puerto (url.port) y el identificador URI del inspector en el explorador iniciado (browserInspectUri).

Para depurar una aplicación Blazor WebAssembly en Visual Studio:

  1. Cree una nueva solución de Blazor WebAssembly hospedada.

  2. Con el proyecto Server seleccionado en el Explorador de soluciones, presione F5 para ejecutar la aplicación en el depurador.

    Nota

    Al realizar una depuración con un explorador basado en Chromium, como Google Chrome o Microsoft Edge, puede que se abra una nueva ventana del navegador con un perfil distinto para la sesión de depuración, en vez de abrir una pestaña en una ventana existente con el perfil del usuario. Si la depuración con el perfil del usuario es un requisito, adopte uno de estos enfoques:

    Nota

    No admite Iniciar sin depuración (Ctrl+F5). Cuando la aplicación se ejecuta en la configuración de depuración, la sobrecarga de depuración siempre genera una pequeña reducción del rendimiento.

  3. En la aplicación *Client*, establezca un punto de interrupción en la línea currentCount++; en Pages/Counter.razor.

  4. En el explorador, vaya a la página Counter y seleccione el botón Hacer clic aquí para alcanzar el punto de interrupción.

  5. En Visual Studio, revise el valor del campo currentCount en la ventana Variables locales.

  6. Presione F5 para continuar la ejecución.

Al depurar una aplicación de Blazor WebAssembly, también puede depurar el código del servidor:

  1. Establezca un punto de interrupción en la página Pages/FetchData.razor de OnInitializedAsync.
  2. Establezca un punto de interrupción en WeatherForecastController en el método de acción Get.
  3. Vaya a la página Fetch Data para alcanzar el primer punto de interrupción en el componente FetchData justo antes de que emita una solicitud HTTP al servidor.
  4. Presione F5 para continuar la ejecución y, luego, alcance el punto de interrupción en el servidor en WeatherForecastController.
  5. Vuelva a presionar F5 para permitir que la ejecución continúe y ver la tabla de pronóstico meteorológico representada en el explorador.

Nota

Los puntos de interrupción no se alcanzan durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.

Si la aplicación se hospeda en una ruta de acceso base de la aplicación distinta de /, actualice las propiedades siguientes en Properties/launchSettings.json para reflejar la ruta de acceso base de la aplicación:

  • applicationUrl:

    "iisSettings": {
      ...
      "iisExpress": {
        "applicationUrl": "http://localhost:{INSECURE PORT}/{APP BASE PATH}/",
        "sslPort": {SECURE PORT}
      }
    },
    
  • inspectUri de cada perfil:

    "profiles": {
      ...
      "{PROFILE 1, 2, ... N}": {
        ...
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/{APP BASE PATH}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        ...
      }
    }
    

Los marcadores de posición en la configuración anterior:

  • {INSECURE PORT}: puerto no seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {APP BASE PATH}: ruta de acceso base de la aplicación.
  • {SECURE PORT}: puerto seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {PROFILE 1, 2, ... N}: perfiles de configuración de inicio. Normalmente, una aplicación especifica más de un perfil de forma predeterminada (por ejemplo, un perfil para IIS Express y un perfil de proyecto, que se usa en el servidor de Kestrel).

En los ejemplos siguientes, la aplicación se hospeda en /OAT con una ruta de acceso base de la aplicación configurada en wwwroot/index.html como <base href="/OAT/">:

"applicationUrl": "http://localhost:{INSECURE PORT}/OAT/",
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/OAT/_framework/debug/ws-proxy?browser={browserInspectUri}",

Para obtener información sobre el uso de una ruta de acceso base de la aplicación personalizada para las aplicaciones de Blazor WebAssembly, vea Hospedaje e implementación de ASP.NET Core Blazor.

Depuración en el explorador

La guía de esta sección se aplica a Google Chrome y Microsoft Edge en Windows.

  1. Ejecute una compilación de depuración de la aplicación en el entorno de desarrollo.

  2. Inicie un explorador y vaya a la dirección URL de la aplicación (por ejemplo, https://localhost:5001).

  3. En el explorador, intente iniciar la depuración remota; para ello, presione Mayús+Alt+D.

    El explorador debe ejecutarse con la depuración remota habilitada, lo cual no es el valor predeterminado. Si la depuración remota está deshabilitada, aparece una página de error que informa de que no se puede encontrar la pestaña del explorador depurable con instrucciones para iniciar el explorador con el puerto de depuración abierto. Siga las instrucciones del explorador, que abre una nueva ventana del explorador. Cierre la ventana anterior del explorador.

  1. Una vez que el explorador se ejecute con la depuración remota habilitada, el método abreviado de teclado de depuración del paso anterior abre una nueva pestaña del depurador.

  2. Tras unos instantes, en la pestaña Orígenes se mostrará una lista de los ensamblados .NET de la aplicación en el nodo file://.

  3. En el código de componente (archivos .razor) y los archivos de código de C# (.cs), se alcanzan los puntos de interrupción establecidos cuando se ejecuta el código. Una vez que se haya alcanzado un punto de interrupción, examine el código una vez (F10) o reanude (F8) la ejecución del código con normalidad.

Blazor proporciona un proxy de depuración que implementa el protocolo Chrome DevTools y aumenta el protocolo con información específica de .NET. Cuando se presiona el método abreviado de teclado de depuración, Blazor apunta a Chrome DevTools en el proxy. El proxy se conecta a la ventana del explorador que se quiere depurar (de ahí la necesidad de habilitar la depuración remota).

Mapas de origen del explorador

Los mapas de origen del explorador permiten al explorador volver a asignar los archivos compilados a sus archivos de código fuente originales y se suelen usar para la depuración del lado cliente. Sin embargo, en la actualidad Blazor no asigna C# directamente a JavaScript o WASM. En su lugar, Blazor realiza la interpretación de IL en el explorador, por lo que los mapas de origen no son pertinentes.

Configuración de firewall

Si un firewall bloquea la comunicación con el proxy de depuración, cree una regla de excepción de firewall que permita la comunicación entre el explorador y el proceso NodeJS.

Advertencia

La modificación de una configuración de firewall debe realizarse con cuidado para evitar la creación de vulnerabilidades de seguridad. Aplique con cuidado las instrucciones de seguridad, siga las recomendaciones de seguridad y respete las advertencias realizadas por el fabricante del firewall.

Permitir la comunicación abierta con el proceso NodeJS:

  • Abre el servidor de Node en cualquier conexión, en función de la configuración y las funcionalidades del firewall.
  • Podría ser arriesgado en función de la red.
  • Solo se recomienda en los equipos de los desarrolladores.

Si es posible, permita solo la comunicación abierta con el proceso NodeJS en redes privadas o de confianza.

Para obtener instrucciones de configuración del Firewall de Windows, vea Crear una regla de programa o servicio de entrada. Para más información, vea Firewall de Windows Defender con seguridad avanzada y los artículos relacionados en la serie de documentos sobre el Firewall de Windows.

Solucionar problemas

Si se encuentra con errores, las sugerencias siguientes pueden ser útiles:

  • En la pestaña Depurador, abra las herramientas para desarrolladores en el explorador. En la consola, ejecute localStorage.clear() para quitar los puntos de interrupción.
  • Confirme que instaló el certificado de desarrollo HTTPS de ASP.NET Core y que es de confianza. Para obtener más información, vea Aplicación de HTTPS en ASP.NET Core.
  • Visual Studio requiere la opción Habilitar depuración de JavaScript para ASP.NET (IE, Edge y Chrome) , en Herramientas > Opciones > Depuración > General. Es el valor predeterminado para Visual Studio. Si la depuración no funciona, confirme que la opción está seleccionada.
  • Si su entorno usa un proxy HTTP, asegúrese de que localhost esté incluido en la configuración de omisión del proxy. Esto puede hacerse al establecer la variable de entorno NO_PROXY en alguna de las siguientes opciones:
    • Archivo launchSettings.json del proyecto.
    • En el nivel de usuario o de entorno del sistema para que se aplique a todas las aplicaciones. Si usa una variable de entorno, reinicie Visual Studio para que el cambio surta efecto.
  • Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Puntos de interrupción de OnInitialized{Async} no ejecutados

El proxy de depuración del marco de Blazor tarda poco tiempo en iniciarse, por lo que es posible que no se ejecuten los puntos de interrupción en los métodos de ciclo de vida OnInitialized{Async}. Se recomienda agregar un retraso al principio del cuerpo del método para dar al proxy de depuración un tiempo para que se inicie antes de que se ejecute el punto de interrupción. Puede incluir el retraso según una directiva de compilador if para asegurarse de que el retraso no está presente en una compilación de versión de la aplicación.

OnInitialized:

protected override void OnInitialized()
{
#if DEBUG
    Thread.Sleep(10000);
#endif

    ...
}

OnInitializedAsync:

protected override async Task OnInitializedAsync()
{
#if DEBUG
    await Task.Delay(10000);
#endif

    ...
}

Tiempo de espera de Visual Studio (Windows)

Si Visual Studio inicia una excepción relacionada con que el adaptador de depuración no ha podido iniciarse en la que se menciona que se ha alcanzado el tiempo de espera, puede ajustar el tiempo de espera con una configuración del Registro:

VsRegEdit.exe set "<VSInstallFolder>" HKCU JSDebugger\Options\Debugging "BlazorTimeoutInMilliseconds" dword {TIMEOUT}

El marcador de posición {TIMEOUT} del comando anterior se expresa en milisegundos. Por ejemplo, un minuto se asigna como 60000.

Las aplicaciones Blazor WebAssembly se pueden depurar con las herramientas de desarrollo del explorador en exploradores basados en Chromium (Edge/Chrome). También puede depurar la aplicación con los siguientes entornos de desarrollo integrado (IDE):

  • Visual Studio
  • Visual Studio para Mac
  • Visual Studio Code

Entre los escenarios disponibles se incluyen los siguientes:

  • Establecimiento y eliminación de puntos de interrupción.
  • Ejecute la aplicación con compatibilidad de depuración en IDE.
  • Examine el código en un solo paso.
  • Reanude la ejecución de código con un método abreviado de teclado en IDE.
  • En la ventana Variables locales, observe los valores de las variables locales.
  • Vea la pila de llamadas, incluidas las cadenas de llamadas entre JavaScript y .NET.

Por ahora, no puede:

  • Interrumpir las operaciones ante excepciones no controladas.
  • Alcanzar puntos de interrupción durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.
  • Depure en escenarios no locales; por ejemplo, el Subsistema de Windows para Linux (WSL) o Visual Studio Codespaces.
  • Recompile automáticamente la aplicación *Server* de back-end de una solución Blazor WebAssembly hospedada durante la depuración, por ejemplo, mediante la ejecución de la aplicación con dotnet watch run.

Requisitos previos

La depuración requiere cualquiera de los exploradores siguientes:

  • Google Chrome (versión 70 o posterior) (predeterminado)
  • Microsoft Edge (versión 80 o posterior)

Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Los usuarios de Visual Studio Code requieren las siguientes extensiones:

Después de abrir un proyecto en VS Code, puede recibir una notificación en la que se indique que se requiere una configuración adicional para habilitar la depuración. Instale las extensiones necesarias de Visual Studio Marketplace, si se le solicita que lo haga. Para inspeccionar las extensiones instaladas, abra Ver > Extensiones en la barra de menús o seleccione el icono Extensiones en la barra lateral Actividad.

Visual Studio para Mac requiere la versión 8.8 (compilación 1532) o una posterior:

  1. Instale la versión más reciente de Visual Studio para Mac seleccionando el botón Descargar Visual Studio para Mac en Microsoft: Visual Studio para Mac.
  2. Seleccione el canal Vista preliminar en Visual Studio. Para obtener más información, vea Instalación de la versión más reciente de Visual Studio para Mac.

Nota

Apple Safari en macOS no se admite actualmente.

Depuración de una aplicación Blazor WebAssembly independiente

Para habilitar la depuración de una aplicación Blazor WebAssembly, actualice el archivo launchSettings.json del proyecto de inicio para incluir la propiedad inspectUri siguiente en cada perfil de inicio:

"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"

Una vez que lo actualice, el archivo launchSettings.json debe ser similar a este ejemplo:

{
    "iisSettings": {
      "windowsAuthentication": false,
      "anonymousAuthentication": true,
      "iisExpress": {
        "applicationUrl": "http://localhost:50454",
        "sslPort": 44399
      }
    },
    "profiles": {
      "IIS Express": {
        "commandName": "IISExpress",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      },
      "BlazorApp1.Server": {
        "commandName": "Project",
        "launchBrowser": true,
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        "applicationUrl": "https://localhost:5001;http://localhost:5000",
        "environmentVariables": {
          "ASPNETCORE_ENVIRONMENT": "Development"
        }
      }
    }
  }

La propiedad inspectUri:

  • Permite que el IDE detecte que la aplicación es una aplicación Blazor WebAssembly.
  • Indica a la infraestructura de depuración de scripts que se conecte al explorador a través del proxy de depuración de Blazor.

El marco de trabajo proporciona los valores de marcador de posición para el protocolo WebSocket (wsProtocol), el host (url.hostname), el puerto (url.port) y el identificador URI del inspector en el explorador iniciado (browserInspectUri).

Para depurar una aplicación Blazor WebAssembly en Visual Studio:

  1. Cree una nueva solución de Blazor WebAssembly hospedada.

  2. Con el proyecto Server seleccionado en el Explorador de soluciones, presione F5 para ejecutar la aplicación en el depurador.

    Nota

    Al realizar una depuración con un explorador basado en Chromium, como Google Chrome o Microsoft Edge, puede que se abra una nueva ventana del navegador con un perfil distinto para la sesión de depuración, en vez de abrir una pestaña en una ventana existente con el perfil del usuario. Si la depuración con el perfil del usuario es un requisito, adopte uno de estos enfoques:

    Nota

    No admite Iniciar sin depuración (Ctrl+F5). Cuando la aplicación se ejecuta en la configuración de depuración, la sobrecarga de depuración siempre genera una pequeña reducción del rendimiento.

  3. En la aplicación *Client*, establezca un punto de interrupción en la línea currentCount++; en Pages/Counter.razor.

  4. En el explorador, vaya a la página Counter y seleccione el botón Hacer clic aquí para alcanzar el punto de interrupción.

  5. En Visual Studio, revise el valor del campo currentCount en la ventana Variables locales.

  6. Presione F5 para continuar la ejecución.

Al depurar una aplicación de Blazor WebAssembly, también puede depurar el código del servidor:

  1. Establezca un punto de interrupción en la página Pages/FetchData.razor de OnInitializedAsync.
  2. Establezca un punto de interrupción en WeatherForecastController en el método de acción Get.
  3. Vaya a la página Fetch Data para alcanzar el primer punto de interrupción en el componente FetchData justo antes de que emita una solicitud HTTP al servidor.
  4. Presione F5 para continuar la ejecución y, luego, alcance el punto de interrupción en el servidor en WeatherForecastController.
  5. Vuelva a presionar F5 para permitir que la ejecución continúe y ver la tabla de pronóstico meteorológico representada en el explorador.

Nota

Los puntos de interrupción no se alcanzan durante el inicio de la aplicación antes de que se ejecute el proxy de depuración. Esto incluye los puntos de interrupción de Program.cs y los de los métodos de ciclo de vida OnInitialized{Async} de los componentes que se cargan en la primera página solicitada por la aplicación.

Si la aplicación se hospeda en una ruta de acceso base de la aplicación distinta de /, actualice las propiedades siguientes en Properties/launchSettings.json para reflejar la ruta de acceso base de la aplicación:

  • applicationUrl:

    "iisSettings": {
      ...
      "iisExpress": {
        "applicationUrl": "http://localhost:{INSECURE PORT}/{APP BASE PATH}/",
        "sslPort": {SECURE PORT}
      }
    },
    
  • inspectUri de cada perfil:

    "profiles": {
      ...
      "{PROFILE 1, 2, ... N}": {
        ...
        "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/{APP BASE PATH}/_framework/debug/ws-proxy?browser={browserInspectUri}",
        ...
      }
    }
    

Los marcadores de posición en la configuración anterior:

  • {INSECURE PORT}: puerto no seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {APP BASE PATH}: ruta de acceso base de la aplicación.
  • {SECURE PORT}: puerto seguro. De forma predeterminada, se proporciona un valor aleatorio, pero también se permite un puerto personalizado.
  • {PROFILE 1, 2, ... N}: perfiles de configuración de inicio. Normalmente, una aplicación especifica más de un perfil de forma predeterminada (por ejemplo, un perfil para IIS Express y un perfil de proyecto, que se usa en el servidor de Kestrel).

En los ejemplos siguientes, la aplicación se hospeda en /OAT con una ruta de acceso base de la aplicación configurada en wwwroot/index.html como <base href="/OAT/">:

"applicationUrl": "http://localhost:{INSECURE PORT}/OAT/",
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/OAT/_framework/debug/ws-proxy?browser={browserInspectUri}",

Para obtener información sobre el uso de una ruta de acceso base de la aplicación personalizada para las aplicaciones de Blazor WebAssembly, vea Hospedaje e implementación de ASP.NET Core Blazor.

Depuración en el explorador

La guía de esta sección se aplica a Google Chrome y Microsoft Edge en Windows.

  1. Ejecute una compilación de depuración de la aplicación en el entorno de desarrollo.

  2. Inicie un explorador y vaya a la dirección URL de la aplicación (por ejemplo, https://localhost:5001).

  3. En el explorador, intente iniciar la depuración remota; para ello, presione Mayús+Alt+D.

    El explorador debe ejecutarse con la depuración remota habilitada, lo cual no es el valor predeterminado. Si la depuración remota está deshabilitada, aparece una página de error que informa de que no se puede encontrar la pestaña del explorador depurable con instrucciones para iniciar el explorador con el puerto de depuración abierto. Siga las instrucciones del explorador, que abre una nueva ventana del explorador. Cierre la ventana anterior del explorador.

  1. Una vez que el explorador se ejecute con la depuración remota habilitada, el método abreviado de teclado de depuración del paso anterior abre una nueva pestaña del depurador.

  2. Tras unos instantes, en la pestaña Orígenes se mostrará una lista de los ensamblados .NET de la aplicación en el nodo file://.

  3. En el código de componente (archivos .razor) y los archivos de código de C# (.cs), se alcanzan los puntos de interrupción establecidos cuando se ejecuta el código. Una vez que se haya alcanzado un punto de interrupción, examine el código una vez (F10) o reanude (F8) la ejecución del código con normalidad.

Blazor proporciona un proxy de depuración que implementa el protocolo Chrome DevTools y aumenta el protocolo con información específica de .NET. Cuando se presiona el método abreviado de teclado de depuración, Blazor apunta a Chrome DevTools en el proxy. El proxy se conecta a la ventana del explorador que se quiere depurar (de ahí la necesidad de habilitar la depuración remota).

Mapas de origen del explorador

Los mapas de origen del explorador permiten al explorador volver a asignar los archivos compilados a sus archivos de código fuente originales y se suelen usar para la depuración del lado cliente. Sin embargo, en la actualidad Blazor no asigna C# directamente a JavaScript o WASM. En su lugar, Blazor realiza la interpretación de IL en el explorador, por lo que los mapas de origen no son pertinentes.

Configuración de firewall

Si un firewall bloquea la comunicación con el proxy de depuración, cree una regla de excepción de firewall que permita la comunicación entre el explorador y el proceso NodeJS.

Advertencia

La modificación de una configuración de firewall debe realizarse con cuidado para evitar la creación de vulnerabilidades de seguridad. Aplique con cuidado las instrucciones de seguridad, siga las recomendaciones de seguridad y respete las advertencias realizadas por el fabricante del firewall.

Permitir la comunicación abierta con el proceso NodeJS:

  • Abre el servidor de Node en cualquier conexión, en función de la configuración y las funcionalidades del firewall.
  • Podría ser arriesgado en función de la red.
  • Solo se recomienda en los equipos de los desarrolladores.

Si es posible, permita solo la comunicación abierta con el proceso NodeJS en redes privadas o de confianza.

Para obtener instrucciones de configuración del Firewall de Windows, vea Crear una regla de programa o servicio de entrada. Para más información, vea Firewall de Windows Defender con seguridad avanzada y los artículos relacionados en la serie de documentos sobre el Firewall de Windows.

Solucionar problemas

Si se encuentra con errores, las sugerencias siguientes pueden ser útiles:

  • En la pestaña Depurador, abra las herramientas para desarrolladores en el explorador. En la consola, ejecute localStorage.clear() para quitar los puntos de interrupción.
  • Confirme que instaló el certificado de desarrollo HTTPS de ASP.NET Core y que es de confianza. Para obtener más información, vea Aplicación de HTTPS en ASP.NET Core.
  • Visual Studio requiere la opción Habilitar depuración de JavaScript para ASP.NET (IE, Edge y Chrome) , en Herramientas > Opciones > Depuración > General. Es el valor predeterminado para Visual Studio. Si la depuración no funciona, confirme que la opción está seleccionada.
  • Si su entorno usa un proxy HTTP, asegúrese de que localhost esté incluido en la configuración de omisión del proxy. Esto puede hacerse al establecer la variable de entorno NO_PROXY en alguna de las siguientes opciones:
    • Archivo launchSettings.json del proyecto.
    • En el nivel de usuario o de entorno del sistema para que se aplique a todas las aplicaciones. Si usa una variable de entorno, reinicie Visual Studio para que el cambio surta efecto.
  • Asegúrese de que los firewalls o servidores proxy no bloquean la comunicación con el proxy de depuración (proceso NodeJS). Para más información, vea la sección Configuración de firewall.

Puntos de interrupción de OnInitialized{Async} no ejecutados

El proxy de depuración del marco de Blazor tarda poco tiempo en iniciarse, por lo que es posible que no se ejecuten los puntos de interrupción en los métodos de ciclo de vida OnInitialized{Async}. Se recomienda agregar un retraso al principio del cuerpo del método para dar al proxy de depuración un tiempo para que se inicie antes de que se ejecute el punto de interrupción. Puede incluir el retraso según una directiva de compilador if para asegurarse de que el retraso no está presente en una compilación de versión de la aplicación.

OnInitialized:

protected override void OnInitialized()
{
#if DEBUG
    Thread.Sleep(10000);
#endif

    ...
}

OnInitializedAsync:

protected override async Task OnInitializedAsync()
{
#if DEBUG
    await Task.Delay(10000);
#endif

    ...
}

Tiempo de espera de Visual Studio (Windows)

Si Visual Studio inicia una excepción relacionada con que el adaptador de depuración no ha podido iniciarse en la que se menciona que se ha alcanzado el tiempo de espera, puede ajustar el tiempo de espera con una configuración del Registro:

VsRegEdit.exe set "<VSInstallFolder>" HKCU JSDebugger\Options\Debugging "BlazorTimeoutInMilliseconds" dword {TIMEOUT}

El marcador de posición {TIMEOUT} del comando anterior se expresa en milisegundos. Por ejemplo, un minuto se asigna como 60000.