如何自动预热MVC.NET应用程序中的每条路线?

时间:2018-12-27 01:35:19

标签: c# .net azure model-view-controller routing

我正在尝试为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吗?

0 个答案:

没有答案