Saltar al contenido

ASP.NET Core equivalente a HttpException de ASP.NET MVC 5

Indagamos en todo el mundo on line para mostrarte la respuesta para tu problema, si continúas con alguna duda puedes dejar tu inquietud y contestaremos con mucho gusto.

Solución:

Implementé el mío HttpException y soporte de middleware que atrapa todos HttpException‘s y los convierte en la respuesta de error correspondiente. A continuación se puede ver un breve extracto. También puede usar el paquete Boxed.AspNetCore Nuget.

Ejemplo de uso en Startup.cs

public void Configure(IApplicationBuilder application)

    application.UseIISPlatformHandler();

    application.UseStatusCodePagesWithReExecute("/error/0");
    application.UseHttpException();

    application.UseMvc();

Método de extensión

public static class ApplicationBuilderExtensions

    public static IApplicationBuilder UseHttpException(this IApplicationBuilder application)
    
        return application.UseMiddleware();
    

software intermedio

internal class HttpExceptionMiddleware

    private readonly RequestDelegate next;

    public HttpExceptionMiddleware(RequestDelegate next)
    
        this.next = next;
    

    public async Task Invoke(HttpContext context)
    
        try
        
            await this.next.Invoke(context);
        
        catch (HttpException httpException)
        
            context.Response.StatusCode = httpException.StatusCode;
            var responseFeature = context.Features.Get();
            responseFeature.ReasonPhrase = httpException.Message;
        
    

HttpException

public class HttpException : Exception

    private readonly int httpStatusCode;

    public HttpException(int httpStatusCode)
    
        this.httpStatusCode = httpStatusCode;
    

    public HttpException(HttpStatusCode httpStatusCode)
    
        this.httpStatusCode = (int)httpStatusCode;
    

    public HttpException(int httpStatusCode, string message) : base(message)
    
        this.httpStatusCode = httpStatusCode;
    

    public HttpException(HttpStatusCode httpStatusCode, string message) : base(message)
    
        this.httpStatusCode = (int)httpStatusCode;
    

    public HttpException(int httpStatusCode, string message, Exception inner) : base(message, inner)
    
        this.httpStatusCode = httpStatusCode;
    

    public HttpException(HttpStatusCode httpStatusCode, string message, Exception inner) : base(message, inner)
    
        this.httpStatusCode = (int)httpStatusCode;
    

    public int StatusCode  get  return this.httpStatusCode;  

A largo plazo, desaconsejaría el uso de excepciones para devolver errores. Las excepciones son más lentas que simplemente devolver un error de un método.

Después de una breve conversación con @davidfowl, parece que ASP.NET 5 no tiene esa noción de HttpException o HttpResponseException que “mágicamente” se convierten en mensajes de respuesta.

Lo que puede hacer es conectarse a la canalización de ASP.NET 5 a través de MiddleWare y crear uno que maneje las excepciones por usted.

Aquí hay un ejemplo del código fuente de su middleware de manejo de errores que establecerá la respuesta código de estado a 500 en caso de una excepción más arriba en la tubería:

public class ErrorHandlerMiddleware

    private readonly RequestDelegate _next;
    private readonly ErrorHandlerOptions _options;
    private readonly ILogger _logger;

    public ErrorHandlerMiddleware(RequestDelegate next, 
                                  ILoggerFactory loggerFactory,
                                  ErrorHandlerOptions options)
    
        _next = next;
        _options = options;
        _logger = loggerFactory.CreateLogger();
        if (_options.ErrorHandler == null)
        
            _options.ErrorHandler = _next;
        
    

    public async Task Invoke(HttpContext context)
    
        try
        
            await _next(context);
        
        catch (Exception ex)
        
            _logger.LogError("An unhandled exception has occurred: " + ex.Message, ex);

            if (context.Response.HasStarted)
            
                _logger.LogWarning("The response has already started, 
                                    the error handler will not be executed.");
                throw;
            

            PathString originalPath = context.Request.Path;
            if (_options.ErrorHandlingPath.HasValue)
            
                context.Request.Path = _options.ErrorHandlingPath;
            
            try
            
                var errorHandlerFeature = new ErrorHandlerFeature()
                
                    Error = ex,
                ;
                context.SetFeature(errorHandlerFeature);
                context.Response.StatusCode = 500;
                context.Response.Headers.Clear();

                await _options.ErrorHandler(context);
                return;
            
            catch (Exception ex2)
            
                _logger.LogError("An exception was thrown attempting
                                  to execute the error handler.", ex2);
            
            finally
            
                context.Request.Path = originalPath;
            

            throw; // Re-throw the original if we couldn't handle it
        
    

Y necesitas registrarlo con StartUp.cs:

public class Startup

    public void Configure(IApplicationBuilder app, 
                          IHostingEnvironment env, 
                          ILoggerFactory loggerfactory)
    
       app.UseMiddleWare();
    

Alternativamente, si solo desea devolver un código de estado arbitrario y no le preocupa el enfoque basado en excepciones, puede usar

return new HttpStatusCodeResult(400);

Actualización: a partir de .NET Core RC 2, el Http prefix se deja caer. Esto es ahora:

return new StatusCodeResult(400);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *