ВЫЗОВ 1: попытаться / поймать
Вы можете добавить промежуточное ПО перед MVC, которое выполнит следующее промежуточное ПО (включая MVC) в попытке / пойматьblock:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
app.UseMyExceptionHandler();
// ...
app.UseMvc();
}
Промежуточное программное обеспечение может выглядеть следующим образом:
public class ExceptionHandlerMiddleware
{
readonly RequestDelegate _next;
readonly ILogger logger;
public ExceptionHandlerMiddleware(RequestDelegate next, ILogger<ExceptionHandlerMiddleware> logger)
{
_next = next;
this.logger = logger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception e)
{
await HandleExceptionAsync(context, e);
}
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
// Log the exceptions
string result = ... cretate the response if you need it
context.Response.ContentType = "application/json";
context.Response.StatusCode = 500;
return context.Response.WriteAsync(result);
}
}
И я использовал метод расширения, чтобы добавить его в конструктор приложений:
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseMyExceptionHandler(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ExceptionHandlerMiddleware>();
}
}
Теперь вы можете удалить try/catch
из всех ваших действий контроллера, потому что все необработанные исключения будут перехвачены промежуточным программным обеспечением.
Есть также некоторые встроенные способы выполнения этого, которыеможет помочь вам.
ВЫЗОВ 2: нулевые проверки для NotFound
Вы можете создать некоторый базовый контроллер, от которого будут наследоваться все ваши контроллеры, и обработать проверку null
в нем:
public class BaseController : ControllerBase
{
protected IActionResult CreateResponse(object result)
{
if (results == null)
return NotFound();
return Ok(results);
}
}
и затем вы заставляете все свои контроллеры наследовать от него:
[ApiController]
public class YourController : BaseController
// ...
И теперь ваш метод действия может выглядеть так:
[HttpGet()]
[Route("Contracts/{id}")]
public async Task<IActionResult> Get(int id)
{
var results = await _service.GetContractByIdAsync(id);
return CreateResponse(results);
}