我正在尝试为Azure中托管的MVC 5网站创建一个自动热身过程,以加快对具有HttpGet的每个页面的首次匹配。
到目前为止,我已经设置了预编译功能,设置了applicationInitialization,但是我不想每次添加/删除/重命名页面时都必须手动维护网站中的applicationInitialization部分。
我的想法是创建一个“ WarmupController”,其索引方法将确定网站中所有有效的ActionResults并对其进行http调用,以自动对其进行预热。然后,我只需要在applicationInitialization部分中有一个条目即可调用该文件来预热网站。
我已经关闭,但是当Controller处于区域中时,我无法确定页面的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吗?