Tôi có ứng dụng lõi asp.net. Việc triển khai phương thức cấu hình chuyển hướng người dùng đến trang "Lỗi" khi có ngoại lệ (trong môi trường không phát triển)Xử lý ngoại lệ trong lõi asp.net?
Tuy nhiên, nó chỉ hoạt động nếu ngoại lệ xảy ra bên trong bộ điều khiển. Nếu ngoại lệ xảy ra bên ngoài bộ điều khiển, ví dụ trong phần mềm trung gian tùy chỉnh của tôi, thì người dùng sẽ không được chuyển hướng đến trang lỗi.
Làm cách nào để chuyển hướng người dùng đến trang "Lỗi" nếu có ngoại lệ trong phần mềm trung gian.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseSession();
app.UseMyMiddleware();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Cập nhật 1
tôi cập nhật mã trên với hai dòng sau đó bị mất tích trong bài viết ban đầu.
app.UseSession();
app.UseMyMiddleware();
Tôi cũng tìm thấy lý do tại sao app.UseExceptionHandler
không thể chuyển hướng đến trang Lỗi.
Khi có một ngoại lệ trong mã phần mềm trung gian của tôi, app.UseExceptionHandler("\Home\Error")
đang chuyển hướng đến \Home\Error
như mong đợi; nhưng vì đó là một yêu cầu mới, phần mềm trung gian của tôi đã thực hiện lại và ném lại ngoại lệ.
Vì vậy, để giải quyết vấn đề tôi đã thay đổi phần mềm trung gian của tôi để chỉ thực hiện if context.Request.Path != "/Home/Error"
Tôi không chắc chắn đây có phải là cách chính xác để giải quyết vấn đề này hay không.
public class MyMiddleWare
{
private readonly RequestDelegate _next;
private readonly IDomainService _domainService;
public MyMiddleWare(RequestDelegate next, IDomainService domain)
{
_next = next;
_domainService = domain;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path != "/Home/Error")
{
if (context.User.Identity.IsAuthenticated && !context.Session.HasKey(SessionKeys.USERINFO))
{
// this method may throw exception if domain service is down
var userInfo = await _domainService.GetUserInformation(context.User.Name).ConfigureAwait(false);
context.Session.SetUserInfo(userInfo);
}
}
await _next(context);
}
}
public static class MyMiddleWareExtensions
{
public static IApplicationBuilder UseMyMiddleWare(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMiddleWare>();
}
}
Trường hợp trong ví dụ là phần mềm trung gian tùy chỉnh của bạn ở đâu? Tôi nghĩ ** 'UseExeptionHandler' sẽ có thể xử lý nó, nhưng phần mềm trung gian của bạn cần được đăng ký ** sau ** **. – Tseng