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);