производительность Html.ActionLink и Url.Action

У меня есть веб-приложение asp.net mvc для крупномасштабного приложения, которое многоязычно и поддерживает 15 разных языков. Я использую маршрутизацию атрибутов для локализации своих маршрутов, так как необходимо локализовать URL-адреса. Это создает 2675 маршрутов.

Я использую вспомогательные методы Html.ActionLink и Url.Action для создания URL-адресов для действий моего контроллера. Однако я обнаружил, что включение их в мои частичные представления Razor замедляет рендеринг моих представлений. Например, если я удалю некоторые из них, время отклика может составлять от 5-6 секунд до менее секунды.

Я считаю, что проблема может быть связана с большим количеством маршрутов. Поэтому я считаю, что требуется оптимизация этого.

У кого-нибудь была такая проблема с маршрутизацией при большом количестве маршрутов в связке с Attribute Routing? Любое кэширование или подобное, которое можно включить, чтобы помочь? Я имею в виду не кэширование вывода, а кэширование маршрутов для обеспечения более быстрого рендеринга Html.ActionLink и Url.Action?

Изменить

С маршрутизацией атрибутов я добавил атрибут префикса маршрута к своим контроллерам, а также атрибут к своим действиям. Ниже приведен пример класса. Я не добавляю маршруты явно нигде, о чем я знаю - я предполагаю, что это делает его маршрутизация атрибутов.

[RoutePrefix("customer", TranslationKey = "customer")]
public partial class CustomerController : BaseController
{

[Route("logon", TranslationKey = "logon")]
public virtual ActionResult LogOn(string returnUrl = "")
{
...
}


[GET("changerepresentative/{id:long}")]
public virtual ActionResult ChangeRepresentative(long id)
{
...
}


[GET("profile", TranslationKey = "profile")]
public virtual ActionResult ProfileInformation()
{
...
}

// etc

}

Конфигурация маршрутизации атрибутов

RouteTable.Routes.MapAttributeRoutes(config =>
                                           {
                                               var translationProvider = this.routeTranslationProvider.GetProvider();
                                               config.AddRoutesFromAssemblyOf<MvcApplication>();
                                               config.AddTranslationProvider(translationProvider);
                                               config.AppendTrailingSlash = true;
                                               config.UseLowercaseRoutes = true;
                                               config.InheritActionsFromBaseController = true;
                                               config.AutoGenerateRouteNames = true;
                                               config.RouteNameBuilder = RouteNameBuilders.FirstInWins;
                                           });

person amateur    schedule 16.06.2014    source источник
comment
Вы измеряете время отладочной сборки в отладочной среде или релизной сборки на рабочем сервере? Они дают очень разные результаты :)   -  person Gone Coding    schedule 17.06.2014
comment
Я измерил сборку отладки и выпуск в среде разработки, и обе они дали относительно схожие результаты.   -  person amateur    schedule 17.06.2014
comment
Просто перечитайте свой вопрос. Неудивительно, что это медленно. Вам не нужно 2675 маршрутов ни при каких обстоятельствах (более 5 кажется чрезмерным). Html.ActionLink и т. д. должны выполнить поиск в этой таблице, чтобы убедиться, что они выдают максимально короткий URL-адрес (с учетом значений по умолчанию). Можете ли вы опубликовать пример ваших пользовательских URL-адресов и нескольких пользовательских маршрутов, чтобы я мог предложить альтернативу. (например, я добавил только одну дополнительную пользовательскую маршрутизацию для обработки 9 языков в нашей системе).   -  person Gone Coding    schedule 17.06.2014
comment
Спасибо за вашу помощь - я обновил вопрос сейчас. Я нигде явно не добавляю маршруты 2675, я считаю, что маршрутизация атрибутов делает это.   -  person amateur    schedule 17.06.2014
comment
Вам нужно избегать подобных ситуаций. Каков требуемый формат ваших URL-адресов? Я озадачен, зачем вам нужны атрибуты для начала, поэтому сначала просто пытаюсь понять это :)   -  person Gone Coding    schedule 17.06.2014
comment
Может быть, это непонимание с моей стороны, но я понял, что мне нужно будет указать TranslationKey в атрибуте AttributeRouting? Или как мне настроить маршрутизацию для действий?   -  person amateur    schedule 17.06.2014
comment
Вас бы устроили стандартные URL-адреса domain.com/lang/controller/action/id, где lang — это код ISO, например fr или fr-FR?   -  person Gone Coding    schedule 17.06.2014
comment
К сожалению, нет, требуется, чтобы в URL-адресе не было следов языка или кода ISO.   -  person amateur    schedule 17.06.2014
comment
Несчастный. Вы действительно застряли между молотом и наковальней. Вам нужно уменьшить отсчет маршрута, иначе он всегда будет медленным (или заменить обработчик маршрутизации, что нетривиально). Сайты используют этот стандарт не зря (он эффективен).   -  person Gone Coding    schedule 17.06.2014
comment
Да, из исследований, я понимаю. Нужен шанс. Однако в качестве альтернативы я хочу кэшировать маршруты, реализуя собственный UrlHelper, аналогичный тому, что описано здесь - slideshare.net/rudib/aspnet-mvc-performance   -  person amateur    schedule 17.06.2014
comment
Будьте осторожны при чтении документа пятилетней давности о производительности.   -  person Erik Philips    schedule 17.06.2014
comment
Спасибо за отзыв - да, я позабочусь об этом, но я много изучил это и, похоже, не могу найти, было ли кэширование маршрутов введено в структуру MVC на данный момент.   -  person amateur    schedule 17.06.2014


Ответы (1)


Я сталкиваюсь с аналогичной проблемой с нашим приложением .NET MVC. Я также не нашел способа кэшировать таблицу маршрутов. Пока не будет найдено лучшее решение, вы можете заменить ActionLink на RouteLink, который ищет маршрут на основе ключа, что намного быстрее.

person Phil Hale    schedule 12.11.2014