Я пытаюсь создать автоматизированную процедуру разминки для своего веб-сайта MVC 5, который размещен в Azure, чтобы ускорить первое обращение к каждой странице, на которой есть HttpGet.
Пока что янастроить прекомпиляцию, настроить applicationInitialization, но мне не нужно вручную поддерживать раздел applicationInitialization на веб-сайте каждый раз, когда страница добавляется / удаляется / переименовывается.
У меня есть идея создать отдельную«WarmupController», чей метод индекса определит все допустимые ActionResults на веб-сайте и сделает для них http-вызов, чтобы автоматически согреть их.Тогда у меня будет только одна запись в разделе applicationInitialization, которая будет вызываться для разогрева сайта.
Я близок, однако не могу определить URL страницы, когда контроллер находится вплощадь.Вот как я сейчас получаю все ActionResults:
Assembly asm = Assembly.GetExecutingAssembly();
var typeList = asm.GetTypes()
.Where(type => typeof(Controller).IsAssignableFrom(type))
.SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(m => !m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), true).Any())
.OrderBy(d => d.DeclaringType.Name).ThenBy(d => d.Name).ToList();
Оттуда я могу упростить список до следующего:
var pageList = typeList.Select(x => new
{
Controller = x.DeclaringType.Name,
Action = x.Name,
FullName = x.DeclaringType.FullName,
Url = Request.Url.GetLeftPart(UriPartial.Authority) + "/glthome/" + x.DeclaringType.Name.Replace("Controller", "") + "/" + x.Name
}).Where(d => d.Controller != "WarmupController").Distinct().ToList();
Генерируемое свойство URL близко, но нене включайте название области.Я не вижу ничего очевидного в "typeList", который сказал бы мне "ах, это название области" для генерации URL.
Может кто-нибудь дать мне совет о том, как создать последовательный и надежныйURL для каждой страницы сайта?