ningún - que es owin c#
Cambiar el objeto de respuesta de OWIN Middleware (2)
Sí, se recomienda el uso de OwinMiddleware. La razón por la que algunas clases de middleware no se derivan de OwinMiddleware es que o bien no se han cambiado todavía porque la clase se introdujo recientemente. O para evitar que el ensamblado tome una dependencia del ensamblado Microsoft.Owin por alguna razón.
La razón probable por la que se configuran cosas en la respuesta después de llamar a Invoke on Next no funciona, es que el encabezado HTTP de respuesta se envía tan pronto como alguien comienza a escribir en el flujo de cuerpo de la respuesta. Por lo tanto, cualquier cambio en el código de estado o encabezados HTTP después de que un componente de middleware comience a escribir en el cuerpo de la respuesta no tendrá ningún efecto.
Lo que puede intentar hacer es usar la devolución de llamada OnSendingHeaders que proporciona OWIN. Así es como puedes usarlo:
public override async Task Invoke(IOwinContext context)
{
var response = context.Response;
var request = context.Request;
response.OnSendingHeaders(state =>
{
var resp = (OwinResponse)state;
resp.Headers.Add("X-MyResponse-Header", "Some Value");
resp.StatusCode = 403;
resp.ReasonPhrase = "Forbidden";
}, response);
var header = request.Headers["X-Whatever-Header"];
await Next.Invoke(context);
}
Crédito a biscuit314 por actualizar mi respuesta.
Mi middleware OWIN es así. (Framework es ASP.NET Web API).
public class MyMiddleware : OwinMiddleware
{
public MyMiddleware(OwinMiddleware next) : base(next) { }
public override async Task Invoke(OwinRequest request, OwinResponse response)
{
var header = request.GetHeader("X-Whatever-Header");
await Next.Invoke(request, response);
response.SetHeader("X-MyResponse-Header", "Some Value");
response.StatusCode = 403;
}
}
Preguntas:
¿Es la práctica recomendada derivar de
OwinMiddleware
? Veo que en la fuente de Katana, algunas de las clases de middleware se derivan deOwinMiddleware
y otras no.Puedo ver los encabezados de las solicitudes bien. Establecer encabezado de respuesta o código de estado después de
Next.Invoke
en mi middleware no tiene ningún efecto en la respuesta devuelta al cliente. Pero si configuro el encabezado o el estado de la respuesta antes de la llamadaNext.Invoke
, la respuesta con los encabezados y el estado que establezco se devuelve al cliente. ¿Cuál es la forma correcta de configurar estos?
Traté de editar la excelente respuesta de Youssef para corregir un error menor y actualizar el ejemplo de cómo funciona ahora el OwinMiddleware.
La edición fue rechazada (bueno, aprobada por una, rechazada por una por ser demasiado menor, y rechazada por dos por ser demasiado importante).
Aquí está esa versión del código de Youssef:
public override async Task Invoke(IOwinContext context)
{
var response = context.Response;
var request = context.Request;
response.OnSendingHeaders(state =>
{
var resp = (OwinResponse)state;
resp.Headers.Add("X-MyResponse-Header", "Some Value");
resp.StatusCode = 403;
resp.ReasonPhrase = "Forbidden"; // if you''re going to change the status code
// you probably should also change the reason phrase
}, response);
var header = request.Headers["X-Whatever-Header"];
await Next.Invoke(context);
}