উত্তমরূপে গৃহীত উত্তর আমাকে অনেক সাহায্য করেছে তবে রানটাইম সময়ে ত্রুটি স্থিতির কোড পরিচালনা করতে আমি আমার মিডলওয়্যারটিতে এইচটিপিস্ট্যাটাসকোডটি পাস করতে চেয়েছিলাম।
এই লিঙ্কটি অনুসারে আমি একই কাজ করার জন্য কিছু ধারণা পেয়েছি। সুতরাং আমি এর সাথে Andrei উত্তরটি একত্রিত করেছি। সুতরাং আমার চূড়ান্ত কোড নীচে:
1. বেস ক্লাস
public class ErrorDetails
{
public int StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
2. কাস্টম ব্যতিক্রম শ্রেণির ধরণ
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. কাস্টম ব্যতিক্রম মিডলওয়্যার
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);
}
}
৪. সম্প্রসারণ পদ্ধতি
public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<CustomExceptionMiddleware>();
}
5. স্টার্টআপ.সিগুলিতে পদ্ধতিটি কনফিগার করুন
app.ConfigureCustomExceptionMiddleware();
app.UseMvc();
অ্যাকাউন্ট কন্ট্রোলারে এখন আমার লগইন পদ্ধতি:
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;
}
সর্বোপরি যদি আমি খুঁজে পেলাম না ব্যবহারকারী তারপর HttpStatusCodeException যা আমি অতিক্রান্ত HttpStatusCode.NotFound অবস্থা এবং একটি কাস্টম বার্তা উত্থাপন আপনি দেখতে পারেন
মিডলওয়্যার ইন
ধরা (HttpStatusCodeException প্রাক্তন)
অবরুদ্ধকে বলা হবে যা নিয়ন্ত্রণটি পাস করবে
প্রাইভেট টাস্ক হ্যান্ডেলএক্সেপশনএেন্সেকশন
।
তবে যদি আমি আগে রানটাইম ত্রুটি পেয়েছি? তার জন্য আমি ট্র্যাচ ক্যাচ ব্লক ব্যবহার করেছি যা ব্যতিক্রম ছুঁড়ে ফেলেছে এবং ক্যাচে ধরা হবে (ব্যতিক্রম ব্যতিক্রম) ব্লক এবং নিয়ন্ত্রণটি পাস করবে
টাস্ক হ্যান্ডেলএক্সেপশনএসেনসিঙ্ক (এইচটিটিপি কনটেক্সট প্রসঙ্গ, ব্যতিক্রম ব্যতিক্রম)
পদ্ধতি।
আমি অভিন্নতার জন্য একক ত্রুটিপত্রের ক্লাস ব্যবহার করেছি।
UseExceptionHandler
মিডলওয়্যার চেষ্টা করেছেন ?