استفاده از ProblemDetailsService 🛠
فراخوانی AddProblemDetails یک پیادهسازی پیشفرض از IProblemDetailsService را ثبت میکند. این سرویس میتواند پاسخ را برای ما بنویسد.
در اینجا نحوه استفاده از آن در CustomExceptionHandler آمده است:
public class CustomExceptionHandler(IProblemDetailsService problemDetailsService) : IExceptionHandler
{
public async ValueTask<bool> TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
var problemDetails = new ProblemDetails
{
Status = exception switch { /* ... */ },
// ...
};
return await problemDetailsService.TryWriteAsync(new ProblemDetailsContext
{
Exception = exception,
HttpContext = httpContext,
ProblemDetails = problemDetails
});
}
}
سفارشیسازی Problem Details 🎨
ما میتوانیم یک delegate به متد AddProblemDetails پاس دهیم تا CustomizeProblemDetails را تنظیم کنیم. شما میتوانید از این برای افزودن اطلاعات اضافی به تمام پاسخهای Problem Details استفاده کنید.
builder.Services.AddProblemDetails(options =>
{
options.CustomizeProblemDetails = context =>
{
context.ProblemDetails.Instance =
$"{context.HttpContext.Request.iss.onethod} {context.HttpContext.Request.Path}";
context.ProblemDetails.Extensions.TryAdd("requestId", context.HttpContext.TraceIdentifier);
Activity? activity = context.HttpContext.Features.Get<IHttpActivityFeature>()?.Activity;
context.ProblemDetails.Extensions.TryAdd("traceId", activity?.Id);
};
});
این سفارشیسازی مسیر درخواست، یک requestId و یک traceId را به هر پاسخ Problem Details اضافه میکند که قابلیت دیباگ و ردیابی خطاها را افزایش میدهد.
مدیریت استثناهای خاص (کدهای وضعیت) 🆕
حالا 9 Net. یک راه سادهتر برای مپ کردن استثناها به کدهای وضعیت معرفی میکند. شما میتوانید از StatusCodeSelector برای تعریف این مپینگها استفاده کنید.
app.UseExceptionHandler(new ExceptionHandlerOptions
{
StatusCodeSelector = ex => ex switch
{
ArgumentException => StatusCodes.Status400BadRequest,
NotFoundException => StatusCodes.Status404NotFound,
_ => StatusCodes.Status500InternalServerError
}
});
نکات پایانی ✅
پیادهسازی Problem Details در APIهای ASP.NET Core شما بیش از یک رویه بهتر است - این یک استاندارد برای بهبود تجربه توسعهدهنده مصرفکنندگان API شماست. با ارائه پاسخهای خطای یکپارچه، دقیق و با ساختار مناسب، شما درک و مدیریت سناریوهای خطا را برای کلاینتها آسانتر میکنید.
🔖 هشتگها:
#CSharp #DotNet #ASPNETCore #ErrorHandling #ExceptionHandling #WebAPI #ProblemDetails