TransWikia.com

cómo modificar el header de una respuesta en función de la llamada? (.net core 3.1)

Stack Overflow en español Asked by Iria on November 4, 2021

os explico mi problema:

Tengo que crear un único proyecto net core 3.1 para crear una api. Sencillo, no?

Bueno, pues esta es la complicación: según se haga una llamada u otra, el conjunto de cabeceras de la respuesta http, (httpresponse) es uno u otro.

Entonces, he googleado un poco y he encontrado lo siguiente: https://www.red-gate.com/simple-talk/dotnet/net-development/http-response-headers-asp-net-core/:

public void Configure(IApplicationBuilder app)
{
    // Add a sample response header 
    app.Use(async (context, nextMiddleware) =>
    {
        context.Response.OnStarting(() =>
        {
            context.Response.Headers.Add("Site", "Simple-Talk");
            return Task.FromResult(0);
        });
        await nextMiddleware();
    });
 
    app.Use(async (context, nextMiddleware) =>
    {
        using (var memory = new MemoryStream())
        {
            var originalStream = context.Response.Body;
            context.Response.Body = memory;
 
            await nextMiddleware();
 
            memory.Seek(0, SeekOrigin.Begin);
            var content = new StreamReader(memory).ReadToEnd();
            memory.Seek(0, SeekOrigin.Begin);
 
            // Apply logic here for deciding which headers to add
            context.Response.Headers.Add("Body", content);
 
            await memory.CopyToAsync(originalStream);
            context.Response.Body = originalStream;
        }
    });
 
    app.Run(async (context) =>
    {
        var obj = new SomeWork();
        await context
            .Response
            .WriteAsync("<h1 style='color:red;'>" + obj.Now() + "</h1>");
    });
}

Mi pregunta es cómo consigo la llamada api, para saber qué cabecera (header) añadir porque esto se ejecuta al iniciar el servidor. Entiendo que la cabecera se ha añadido al principio y no al producir la respuesta.

Bueno, pues este es mi código:

app.Use(async (context, nextMiddleware) =>
            {
                context.Response.OnStarting(() =>
                {
                    //if there is not a valid token and it is not a login request
                    if (context.Request.Headers.ContainsKey("x-session-token"))
                    {
                        var token = context.Request.Headers["x-session-token"].ToString();
                        var time = DateTime.Now;
                        var expireDate = tokenDetails[token];
                        if (expireDate < time)
                        {
                            context.Response.StatusCode = 401;

                        }
                        return Task.FromResult(0);
                    }
                    else if (context.Request.QueryString.ToString().Contains("login"))
                    {
                        // if it is from a login request
                        context.Response.Headers.Add("access-control-allow-headers", "authorization, content-type, x-session-token");
                        context.Response.Headers.Add("access-control-allow-methods", "GET, POST, PUT");
                        context.Response.Headers.Add("access-control-allow-origin", "*");
                        context.Response.Headers.Add("x-session-token", getToken());
                        context.Response.Headers.Add("access-control-allow-max-age", "0");
                        return Task.FromResult(0);
                    }

                    //else
                    else
                    {
                        context.Response.StatusCode = 401; // falla aqui
                        return Task.FromResult(0);
                    }
                });
                await nextMiddleware();
            });

el servidor se queda petado y no termina de arrancar, alguien entiende qué está pasando y cómo arreglarlo?

One Answer

No encuentro problemas en el código que publicaste, lo inserté en mi configuración y aunque no es igual a la tuya, funciona sin errores. Es importante tener en cuenta que el orden en que se colocan los middleware debe ser tomado en cuenta. En las pruebas que hice, encontré una que produjo un 'comportamiento' similar al que reportas pero se resolvió al cambiarlo de posición.

Prueba colocar tu código después de la configuración del swagger.

En los middleware, cada bloque app.Use... puede verse como un eslabón de una cadena que ejecuta una acción sobre el Request o el Response y decide si le pasa la ejecución al siguiente (con await nextMiddleware();) o interrumpe la secuencia.

Cuando recibe un Request, el orden de ejecución es el mismo como se escribe la lista de app.Use... en el método Configure (de arriba hacia abajo), pero cuando envía la respuesta la secuencia de ejecución va en orden inverso. (de abajo hacia arriba)

Answered by Pablo Gutiérrez on November 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP