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 Envío de solicitud POST a index.html

Tengo una aplicación Blazor WASM configurada utilizando la plantilla de Visual Studio. Mi enrutamiento en el archivo Startup.cs para el proyecto del servidor se ve así:

app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
    endpoints.MapControllers();
    endpoints.MapFallbackToFile("index.html");
});

Esto ha estado funcionando muy bien, sirviendo el archivo wwwroot/index.html de mi proyecto cliente cada vez que hago una solicitud GET a rutas para las que no tengo un controlador. El framework Blazor en el proyecto cliente se encarga de ello. Sin embargo, ahora necesito admitir la devolución del archivo index.html tanto para solicitudes GET como para solicitudes POST a puntos finales de mi aplicación para los que no tengo un controlador. Me está resultando muy difícil configurarlo. He probado el método EndpointRouteBuilderExtensions.MapPost y puedo devolver cadenas de texto, pero no veo buenos ejemplos de cómo utilizarlo para devolver archivos. Esto no funciona:

endpoints.MapPost("*", (HttpContext context) =>
{
    context.Request.Path = "/index.html";
    context.SetEndpoint(null);
});

Aunque es similar a lo que hace el método StaticFilesEndpointRouteBuilderExtensions.MapFallbackToFile del framework: enlace

Mi problema es similar a este enlace, pero las respuestas allí no funcionan para mi situación.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para servir el archivo index.html tanto para solicitudes GET como POST a puntos finales que no tienen un controlador, puedes usar el método MapFallbackToFile junto con una implementación personalizada de IActionResult, de esta manera:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Infrastructure;
    using Microsoft.AspNetCore.Routing;
    using System.Threading.Tasks;
    
    public class StaticFileResult : IActionResult
    {
        private readonly IActionContextAccessor _actionContextAccessor;
        private readonly string _filePath;
    
        public StaticFileResult(IActionContextAccessor actionContextAccessor, string filePath)
        {
            _actionContextAccessor = actionContextAccessor;
            _filePath = filePath;
        }
    
        public async Task ExecuteResultAsync(ActionContext context)
        {
            var request = _actionContextAccessor.ActionContext.HttpContext.Request;
            var response = _actionContextAccessor.ActionContext.HttpContext.Response;
    
            response.ContentType = "text/html";
            response.StatusCode = StatusCodes.Status200OK;
    
            await response.SendFileAsync(_filePath);
        }
    }
    

    Luego, en tu archivo Startup.cs, puedes reemplazar la llamada al método MapFallbackToFile con esto:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllers();
        endpoints.MapFallback(context =>
        {
            var actionContext = context.Features.Get<iactioncontextaccessor>().ActionContext;
            var filePath = Path.Combine(env.WebRootPath, "index.html");
            return new StaticFileResult(context.Features.Get<iactioncontextaccessor>(), filePath);
        });
    });
    

    Esto servirá el archivo index.html tanto para solicitudes GET como POST a puntos finales que no tienen un controlador. La implementación StaticFileResult establece el tipo de contenido en “text/html” y envía el archivo como cuerpo de respuesta.

Comments are closed.