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?
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP