Можно ли перенаправить обработку исключений на URL-адреса в ASP.NET ?

#reactjs #asp.net-core #exception #routes #middleware

#reactjs #asp.net-ядро #исключение #маршруты #промежуточное программное обеспечение

Вопрос:

Я работаю над ASP.NET Основное приложение с ReactJS, и я бы хотел, чтобы необработанные исключения перенаправляли свои данные на определенный маршрут (URL-адрес компонента React).Например, предположим, что у меня есть контроллер следующим образом:

 public class StartProblemsController : ControllerBase
{
    [HttpGet]
    public ActionResult Get()
    {
        int a = 1;
        int b = 0;
        int err = a / b;

        return Ok();
    }
}
 

Это явно DivideByZero создает исключение во время выполнения при перенаправлении на. Однако исключение отображается только в консоли, и интерфейс автоматически завершается сбоем, отображая мне пустую веб-страницу. У меня есть следующее промежуточное программное обеспечение:

 app.UseExceptionHandler("/error");
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();

app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action=Index}/{id?}");
});

app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";

    if (env.IsDevelopment())
    {
        spa.UseReactDevelopmentServer(npmScript: "start");
    }
});
 

Я бы подумал, что app.UseExceptionHandler("/error") это сработает и перенаправит браузер на https://.../error , но это не так. Он остается в https://.../startproblems . Есть предложения? Заранее спасибо.

Ответ №1:

React выполняется через npm, маршрутизация сервера будет перезаписана react, а react запрашивает данные через ajax, поэтому они не будут перенаправлены на сервер. Лучший метод — записать ошибку непосредственно на страницу.

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        
        app.UseExceptionHandler(builder =>
        {
            builder.Run(async context =>
            {
                context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                context.Response.ContentType = "application/json";

                var exception = context.Features.Get<IExceptionHandlerFeature>();
                if (exception != null)
                {
                    var error = new ErrorMessage()
                    {
                        Stacktrace = exception.Error.StackTrace,
                        Message = exception.Error.Message
                    };
                    var errObj = JsonConvert.SerializeObject(error);

                    await context.Response.WriteAsync(errObj).ConfigureAwait(false);
                }
            });
        });
        
       //...
    }
 

Класс

 public class ErrorMessage
{
    public string Stacktrace { get; set; }
    public string Message { get; set; }
}
 

введите описание изображения здесь

Если вы не можете просмотреть сообщение об ошибке, откройте консоль браузера, щелкните ошибка сервера.

введите описание изображения здесь

Затем он перейдет к коду ошибки.

введите описание изображения здесь

Комментарии:

1. @Matthew Miller, может принять этот ответ, который может помочь большему количеству людей.