Buscar..


Observaciones

Middleware es un componente de software que determinará cómo procesar la solicitud y decidirá si se pasa al siguiente componente en la canalización de la aplicación. Cada middleware tiene una función y acciones específicas diferentes para realizar en la solicitud.

Uso del middleware ExceptionHandler para enviar un error JSON personalizado al cliente

Defina su clase que representará su error personalizado.

public class ErrorDto
{
   public int Code { get; set; }
   public string Message { get; set; }

   // other fields

   public override string ToString()
   {
      return JsonConvert.SerializeObject(this);
   }
}

Luego ponga el siguiente middleware de ExceptionHandler en el método de configuración. Preste atención a que el orden de middleware es importante.

app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500; // or another Status 
            context.Response.ContentType = "application/json";

            var error = context.Features.Get<IExceptionHandlerFeature>();
            if (error != null)
            {
                var ex = error.Error;

                await context.Response.WriteAsync(new ErrorDto()
                {
                    Code = <your custom code based on Exception Type>,
                    Message = ex.Message // or your custom message
                    
                    ... // other custom data
                }.ToString(), Encoding.UTF8);
            }
        });
    });

Middleware para establecer la respuesta ContentType

La idea es usar HttpContext.Response.OnStarting callback, ya que este es el último evento que se dispara antes de que se envíen los encabezados. Agregue lo siguiente a su método de Invoke middleware.

public async Task Invoke(HttpContext context)
{
    context.Response.OnStarting((state) =>
    {
        if (context.Response.StatusCode == (int)HttpStatusCode.OK)
        {
           if (context.Request.Path.Value.EndsWith(".map"))
           {
             context.Response.ContentType = "application/json";
           }
        }          
        return Task.FromResult(0);
    }, null);

    await nextMiddleware.Invoke(context);
}

Pasar datos a través de la cadena de middleware.

De la documentación :

La colección HttpContext.Items es la mejor ubicación para almacenar datos que solo se necesitan al procesar una solicitud determinada. Su contenido se desecha después de cada solicitud. Se utiliza mejor como medio de comunicación entre componentes o middleware que operan en diferentes puntos en el tiempo durante una solicitud y no tienen una relación directa entre ellos a través de la cual pasar parámetros o valores de retorno.

HttpContext.Items es una simple colección de diccionarios del tipo IDictionary<object, object> . Esta coleccion es

  • disponible desde el inicio de un HttpRequest
  • y se desecha al final de cada solicitud.

Puede acceder a él simplemente asignando un valor a una entrada con clave, o solicitando el valor para una clave determinada.

Por ejemplo, algún Middleware simple podría agregar algo a la colección de Artículos:

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

y más tarde en la tubería, otra pieza de middleware podría acceder a él:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});

Ejecutar, Mapa, Uso

correr

Termina la cadena. Ningún otro método de middleware se ejecutará después de esto. Debe colocarse al final de cualquier tubería.

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from " + _environment);
});

Utilizar

Realiza la acción antes y después del próximo delegado.

app.Use(async (context, next) =>
{
    //action before next delegate
    await next.Invoke(); //call next middleware
    //action after called middleware
});

Ilustración de cómo funciona: introduzca la descripción de la imagen aquí

Mapa cuando

Habilita ramificación de tubería. Ejecuta el middleware especificado si se cumple la condición.

private static void HandleBranch(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Condition is fulfilled");
    });
}

public void ConfigureMapWhen(IApplicationBuilder app)
{
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("somekey");
    }, HandleBranch);
}

Mapa

Similar a MapWhen. Ejecuta middleware si la ruta solicitada por el usuario es igual a la ruta proporcionada en el parámetro.

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app)
{
    app.Map("/maptest", HandleMapTest);

}

Basado en ASP.net Core Docs



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow