es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Blazor WASM Hosted: La llamada a la API con una ruta inválida devuelve 200.

Mi archivo Program.cs del servidor:

WebApplication app = builder.Build();

// Configurar el pipeline de solicitudes HTTP.
if (app.Environment.IsDevelopment())
{
    app.UseWebAssemblyDebugging();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.MapControllers();
app.MapFallbackToFile("index.html");

app.Run();

Cuando llamo a una ruta de API que no existe, obtengo una respuesta 200 y luego la respuesta JSON no válida:

System.Text.Json.JsonException: ‘<‘ es un inicio no válido de un valor.
Path: $ | NúmeroDeLínea: 0 | PosiciónDeBytesEnLínea: 0.

Mi comprensión es que esto se debe a la línea:

app.MapFallbackToFile("index.html");

que hace que el servidor enruté a esta página HTML en caso de no encontrar una ruta.

Basado en esta pregunta link, he intentado varias soluciones, sin éxito.

Entonces, volví al código original mencionado anteriormente y simplemente eliminé la línea:

app.MapFallbackToFile("index.html");

Sin embargo, aún obtengo una respuesta OK para una ruta de API no válida, por lo que cuando intento leer el contenido de la respuesta como JSON, todavía obtengo la JsonException.

¿Qué estoy haciendo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la eliminación de la línea app.MapFallbackToFile("index.html") en realidad no resolvió el problema. Una posibilidad es que el servidor siga sirviendo la página index.html para rutas que no existen en lugar de devolver un código de estado 404 adecuado.

    Para solucionar este problema, puedes intentar agregar la siguiente línea antes de la llamada app.MapControllers():

    app.UseStatusCodePagesWithReExecute("/Error", "?code={0}");
    

    Esto utilizará el punto final /Error para manejar cualquier código de estado que no sea de éxito, incluido el código de estado 404 NotFound. La parte ?code={0} agregará el código de estado a la cadena de consulta de la URL de redireccionamiento.

    Luego, en tu ErrorController, puedes devolver un código de estado 404 adecuado y un mensaje de error en caso de una ruta de API que no existe:

    [ApiController]
    public class ErrorController : ControllerBase
    {
        [HttpGet("/Error")]
        public IActionResult Error([FromQuery] int code)
        {
            if (code == 404)
            {
                return NotFound("No se encontró el punto final de la API.");
            }
    
            // manejar otros códigos de estado si es necesario
    
            return Problem();
        }
    }
    

    Con esta configuración, el servidor debería devolver un código de estado 404 y un mensaje de error en lugar de servir la página index.html para rutas de API que no existen, y deberías poder manejar adecuadamente la respuesta de error en tu código de cliente.

Comments are closed.