Это длинная история (я использовал jquery для вызова API).
Прежде всего, я добавляю обработку исключений следующим образом:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
var result = new BaseResponseDTO<string>()
{
ErrorCode = (int)HttpStatusCode.InternalServerError,
ErrorMessage = ex.Message,
Succeed = false,
};
var jsonResult = JsonConvert.SerializeObject(result);
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(jsonResult);
}
}
И затем зарегистрируйте его (он должен быть зарегистрирован до app.UseMvc ()):
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseMvc();
Хорошо, после этого вызовите свой API. Я всегда возвращаю класс DTO так:
public class BaseResponseDTO<T>
{
public bool Succeed { get; set; }
public string ErrorMessage { get; set; }
public T Result { get; set; }
public int? ErrorCode { get; set; }
}
А теперь мой веб-API: иногда он возвращает значение, а иногда выдает исключение.
public BaseResponseDTO<string> TestApi()
{
var r = new Random();
var random = r.Next(0, 2);
if (random == 0)
throw new Exception("My Exception");
else
return new BaseResponseDTO<string>() { Succeed = true, Result = "Some result..." };
}
В конце, позвоните по jquery:
function callApi() {
$.ajax({
type: 'GET',
url: 'https://localhost:5001/Home/TestApi',
data: null,
dataType: 'json',
success: function (data) {
if (data.succeed) {
alert(data.result);
}
else {
alert(data.errorMessage);
}
},
error: function (error) {
debugger;
alert(error.responseJSON.ErrorMessage);
}
});
}
Если Api возвращает исключение:
Если Api возвращает результат: