Ant*_*ère 14 c# error-handling asp.net-core asp.net-core-2.0
我正在寻找一种方法来返回调用我的Web API方法时发生的任何异常的详细信息.
默认情况下,在生产环境中,错误500"内部服务器错误"是API返回的唯一信息.
它是一个私有API,不通过Internet发布,调用者应用程序需要获取并存储所有细节以防异常.
异常详细信息可以是HttpResponse内容中的JSON格式,允许调用者读取Message属性,以及异常的StackTraceString属性(无HTTP页面,如UseDeveloperExceptionPage配置).
目前默认的启动配置方法是:
public class Startup
{
[...]
public void Configure(IApplicationBuilder app, IHostingEnvironment env, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
env.ConfigureNLog(Path.Combine(AppContext.BaseDirectory, "nlog.config"));
if ( env.IsDevelopment() )
app.UseDeveloperExceptionPage();
else
app.UseStatusCodePages();
app.UseMvc();
}
}
Run Code Online (Sandbox Code Playgroud)
Com*_*Guy 20
您可以编写一个自定义中间件,它拦截所有异常并将它们返回给调用者:
public class ExceptionHandler
{
private readonly RequestDelegate _next;
public ExceptionHandler(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var response = context.Response;
response.ContentType = "application/json";
response.StatusCode = (int)HttpStatusCode.InternalServerError;
await response.WriteAsync(JsonConvert.SerializeObject(new
{
// customize as you need
error = new
{
message = exception.Message,
exception = exception.GetType().Name
}
}));
}
}
Run Code Online (Sandbox Code Playgroud)
并在您的启动配置方法中注册它:
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseMiddleware<ExceptionHandler>();
Run Code Online (Sandbox Code Playgroud)
除中间件外,您还可以创建ActionFilterAttribute并更改IActionResult
下面是一个简单的示例attribuet,对于所有未处理的异常,使用Exception方法返回400 Bad请求.
public class MyUnhandledExceptionFilter : ActionFilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{
context.Result = new BadRequestObjectResult(context.Exception.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在启动的ConfigureServices方法中注册它
services.AddMvc(options =>
{
options.Filters.Add(typeof(MyUnhandledExceptionFilter));
})
Run Code Online (Sandbox Code Playgroud)
这只能捕获到达MVC的异常,这在大多数情况下都是您需要的
| 归档时间: |
|
| 查看次数: |
12057 次 |
| 最近记录: |