В настоящее время я узнаю об управлении ошибками в управлении ошибками в проектах ASP.NET Core Web API, чтобы попытаться найти элегантное решение, которое гарантирует, что проблемы с проблемами всегда возвращается, когда что -то идет не так.
Я использую шаблон API WeachforeCast < /code>, который создается при создании нового проекта C# /ASP.NET Core 8 с контроллерами. < /p>
У меня есть реализовал пользовательский обработчик исключений; Однако я обнаружил, что это не всегда работает. , код статуса и информация заголовка; Однако, когда я вызываю API из функции «Попробуйте это» в интерфейсе Swagger , я возвращаю неправильный код состояния (внутренняя ошибка 500) с деталями исключения, а не с проблемами с проблемами и неправильно Информация заголовка. /code> Метод возвращает false Если я пробую код из Swagger; Однако, когда я выполняю тот же код, вызывая его из Postman the argendetailsservice.trywriteasync (...) Метод возвращает true .
Я поместил случай Ибо, когда «woodgedetailsservice.triteasync (...)» возвращает, что я мог бы попытаться напрямую написать проблему, что дает задачу httpcontext.response .
Когда я это сделал, я смог поймать следующее исключение (опять же, это происходит только при использовании функции кода Swagger's Try .... не при вызове из почтальона): < /p>
< P> сериализация и десериализация экземпляров 'System.Type' не поддерживается. Путь: $ .httpcontext.features.key. "< /P>
< /blockquote>
Я не знаю, почему это терпит неудачу. < /P>
Я ищу помощь в том, как обеспечить ведение моего управления ошибками так же, независимо от того, как называется API. /p>
public class GlobalExceptionHandler : IExceptionHandler
{
private readonly IProblemDetailsService _problemDetailsService;
public GlobalExceptionHandler(IProblemDetailsService problemDetailsService)
{
if (problemDetailsService == null) throw new ArgumentException(nameof(problemDetailsService));
_problemDetailsService = problemDetailsService;
}
public async ValueTask TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken)
{
var message = exception switch
{
ArgumentException => ((ArgumentException)exception).Message,
ValidationException => ((ValidationException)exception).Message,
_ => $"Internal Server Error ({exception.GetType().Name})"
};
int status = exception switch
{
ArgumentException => (int)HttpStatusCode.BadRequest,
ValidationException => (int)HttpStatusCode.BadRequest,
_ => (int)HttpStatusCode.InternalServerError
};
ProblemDetails problemDetails = new()
{
Title = $"Bad Request: {exception.GetType().Name}", // human-readable summary of the problem type
Detail = message, //detailed explanation specific to the problem
Status = status,
Instance = httpContext.Request.GetEncodedUrl(),
Type = exception.HelpLink
};
var errorcontext = new ProblemDetailsContext()
{
HttpContext = httpContext,
ProblemDetails = problemDetails,
//Exception = exception,
AdditionalMetadata = null
};
httpContext.Response.Clear();
httpContext.Response.StatusCode = status;
var written = await _problemDetailsService.TryWriteAsync(errorcontext);
if (!written)
{
try
{
await httpContext.Response.WriteAsJsonAsync(errorcontext);
written = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
written = false;
}
}
return written;
}
}
Это моя программа.cs :
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Net.Http;
using Microsoft.AspNetCore.Diagnostics;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Add services to the container.
builder.Services.AddExceptionHandler
(); // Using a custom exception handler that converts the exception into a Problem Details
builder.Services.AddProblemDetails(); // required for using the exception handler with the custom problem details exception handler code because it adds the services required for Problem Details
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseExceptionHandler(opt => { }); //adding the custom GlobalExceptionHandler to the app's pipeline
app.UseAuthorization();
app.MapControllers();
app.Run();
И это реализация для моего WeatherForeCastController (не то, чтобы вызовать ни поста или Get, выбросит исключение, которое будет обработано пользовательским обработчиком исключений)
Br />[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger = logger;
}
[HttpGet("GetWeatherForecast")]
public ActionResult GetWeatherForecast()
{
throw new ArgumentException("Please provide a valid value for a week day: between 0 and 6");
}
[HttpPost("PostWeatherForecastDTO")]
public ActionResult PostWeatherForecastDTO()
{
throw new Exception("Please provide a valid value for a week day: between 0 and 6");
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... -and-net-8
Пользовательский обработчик исключений в API Controller сбой в C# и .NET 8 ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Обработчик исключений Spring @Controller и глобальный обработчик исключений. Как вызвать оба
Anonymous » » в форуме JAVA - 0 Ответы
- 61 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Пользовательский обработчик исключений в API Controller сбой в C# и .NET 8
Anonymous » » в форуме C# - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Глобальный обработчик исключений отменяет обработчик транзакций базы данных
Anonymous » » в форуме JAVA - 0 Ответы
- 91 Просмотры
-
Последнее сообщение Anonymous
-