Eine gut akzeptierte Antwort hat mir sehr geholfen, aber ich wollte HttpStatusCode in meiner Middleware übergeben, um den Fehlerstatuscode zur Laufzeit zu verwalten.
Laut diesem Link habe ich eine Idee, dasselbe zu tun. Also habe ich die Andrei-Antwort damit zusammengeführt. Mein endgültiger Code ist also unten:
1. Basisklasse
public class ErrorDetails
{
public int StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
}
2. Benutzerdefinierter Ausnahmeklassentyp
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. Benutzerdefinierte Ausnahme Middleware
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. Verlängerungsmethode
public static void ConfigureCustomExceptionMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<CustomExceptionMiddleware>();
}
5. Konfigurieren Sie die Methode in startup.cs
app.ConfigureCustomExceptionMiddleware();
app.UseMvc();
Nun meine Anmeldemethode im Account Controller:
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;
}
Oben können Sie sehen, ob ich den Benutzer nicht gefunden habe, und dann die HttpStatusCodeException auslösen, in der ich den Status HttpStatusCode.NotFound und eine benutzerdefinierte Nachricht
in Middleware übergeben habe
catch (HttpStatusCodeException ex)
blockiert wird aufgerufen, wodurch die Kontrolle an übergeben wird
private Task HandleExceptionAsync-Methode (HttpContext-Kontext, HttpStatusCodeException-Ausnahme)
.
Aber was ist, wenn ich vorher einen Laufzeitfehler habe? Dafür habe ich try catch block verwendet, der eine Ausnahme auslöst und im catch-Block (Exception exceptionObj) abgefangen wird und die Kontrolle an übergibt
Task HandleExceptionAsync (HttpContext-Kontext, Ausnahme Ausnahme)
Methode.
Ich habe eine einzelne ErrorDetails-Klasse verwendet, um die Einheitlichkeit zu gewährleisten.
UseExceptionHandler
Middleware ausprobiert ?