У нас есть приложение .NET Core 2.1, работающее на Azure. Редко происходит сбой с неисправимой ошибкой 500, которая требует перезагрузки сайта. Мы заметили следующую исключительную ситуацию / трассировку стека, которая появляется в нашем журнале аналитики приложений в сотни раз:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Microsoft.AspNetCore.Routing.RouteValueDictionary.ListStorage.Clear()
at Microsoft.AspNetCore.Routing.RouteValueDictionary.Clear()
at Microsoft.AspNetCore.Routing.RouteData.RouteDataSnapshot.Restore()
at Microsoft.AspNetCore.Routing.RouteCollection.<RouteAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.<Invoke>d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.<ProcessRequestsAsync>d__2.MoveNext()
Это сбивает с толку и расстраивает, так как на первый взгляд ни один из задействованных кодов не кажется нашим, но, возможно, это из-за неправильной конфигурации нашей маршрутизации?
Для справки наш звонок по UseMvc:
app.UseMvc(routes =>
{
var section = Configuration.GetSection("AppSettings:HostNames");
var hostnames = section.Get<string[]>();
// Prepare special routes
routes.MapRoute("takeSurveyApi", "TakeSurvey/{action}/{id?}", new { controller = "TakeSurvey", action = "Index" });
routes.MapRoute("takeSurvey", "TakeSurvey/{id?}", new { controller = "TakeSurvey", action = "Index" });
routes.MapRoute("stripeWebhook", "Billing/WebHook", new { controller = "Billing", action = "WebHook" });
routes.MapSubdomainRoute(
hostnames,
"MHP",
"{tenant}",
"MHP/{action}",
new { controller = "MHP", action = "GetTenantDetails" });
routes.MapSubdomainRoute(
hostnames,
"Localisation",
"{tenant}",
"Localisation/{action}",
new { controller = "Localisation", action = "Get" });
routes.MapSubdomainRoute(
hostnames,
"TenantInSubdomain",
"{tenant}",
"{*url}",
new { controller = "Home", action = "Index" });
routes.MapRoute(
hostnames,
"DefaultRoute",
"{controller}/{action}/{id?}",
new { controller = "Home", action = "Index" });
routes.MapRoute(
hostnames, "reactRouter", "{*url}", new {controller = "Home", action = "Index"});
});
Кто-нибудь сталкивался с подобным набором обстоятельств раньше?