System.IndexOutOfRangeException в Microsoft.AspNetCore.Routing.RouteValueDictionary - PullRequest
0 голосов
/ 14 марта 2019

У нас есть приложение .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"});
});

Кто-нибудь сталкивался с подобным набором обстоятельств раньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...