İyi kabul edilen cevap bana çok yardımcı oldu ama çalışma zamanında hata durum kodunu yönetmek için benim Middleware HttpStatusCode geçmek istedim.
Bu bağlantıya göre , aynı şeyi yapmak için bir fikrim var. Bu yüzden Andrei Answer ile birleştim. Son kodum şu şekildedir:
1. Temel sınıf
public class ErrorDetails
{
public int StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
2. Özel İstisna Sınıfı Türü
public class HttpStatusCodeException : Exception
{
public HttpStatusCode StatusCode { get; set; }
public string ContentType { get; set; } = @"text/plain";
public HttpStatusCodeException(HttpStatusCode statusCode)
{
this.StatusCode = statusCode;
}
public HttpStatusCodeException(HttpStatusCode statusCode, string message) : base(message)
{
this.StatusCode = statusCode;
}
public HttpStatusCodeException(HttpStatusCode statusCode, Exception inner) : this(statusCode, inner.ToString()) { }
public HttpStatusCodeException(HttpStatusCode statusCode, JObject errorObject) : this(statusCode, errorObject.ToString())
{
this.ContentType = @"application/json";
}
}
3. Özel İstisna Ara Katman
public class CustomExceptionMiddleware
{
private readonly RequestDelegate next;
public CustomExceptionMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (HttpStatusCodeException ex)
{
await HandleExceptionAsync(context, ex);
}
catch (Exception exceptionObj)
{
await HandleExceptionAsync(context, exceptionObj);
}
}
private Task HandleExceptionAsync(HttpContext context, HttpStatusCodeException exception)
{
string result = null;
context.Response.ContentType = "application/json";
if (exception is HttpStatusCodeException)
{
result = new ErrorDetails() { Message = exception.Message, StatusCode = (int)exception.StatusCode }.ToString();
context.Response.StatusCode = (int)exception.StatusCode;
}
else
{
result = new ErrorDetails() { Message = "Runtime Error", StatusCode = (int)HttpStatusCode.BadRequest }.ToString();
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
return context.Response.WriteAsync(result);
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
string result = new ErrorDetails() { Message = exception.Message, StatusCode = (int)HttpStatusCode.InternalServerError }.ToString();
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
return context.Response.WriteAsync(result);
}
}
4. Genişletme Yöntemi
public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<CustomExceptionMiddleware>();
}
5. startup.cs dosyasında Yöntemi Yapılandırma
app.ConfigureCustomExceptionMiddleware();
app.UseMvc();
Şimdi Hesap denetleyicisindeki giriş yöntemim:
try
{
IRepository<UserMaster> obj = new Repository<UserMaster>(_objHeaderCapture, Constants.Tables.UserMaster);
var Result = obj.Get().AsQueryable().Where(sb => sb.EmailId.ToLower() == objData.UserName.ToLower() && sb.Password == objData.Password.ToEncrypt() && sb.Status == (int)StatusType.Active).FirstOrDefault();
if (Result != null)//User Found
return Result;
else// Not Found
throw new HttpStatusCodeException(HttpStatusCode.NotFound, "Please check username or password");
}
catch (Exception ex)
{
throw ex;
}
İ Daha sonra kullanıcı HttpStatusCodeException hangi i geçti HttpStatusCode.NotFound statü ve özel bir mesaj yükselterek bulamamaları durumunda Gördüğünüz Üstü
katman olarak
catch (HttpStatusCodeException ex)
kontrolünü geçecek olan
private Task HandleExceptionAsync (HttpContext bağlamı, HttpStatusCodeException istisna) yöntemi
.
Ama daha önce çalışma zamanı hatası alırsam ne olur? Bunun için istisna atmak ve catch (Exception exceptionObj) bloğunda yakalanacak olan denemek catch blok kullandık ve
Task HandleExceptionAsync (HttpContext bağlamı, İstisna istisnası)
yöntem.
Tekdüzelik için tek bir ErrorDetails sınıfı kullandım.
UseExceptionHandler
katman yazılımını denediniz mi?