#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, может принять этот ответ, который может помочь большему количеству людей.