检测Visual Studio何时测试网站的智能感知

And*_*tan 11 c# visual-studio-2010 razor asp.net-mvc-3 asp.net-mvc-4

这里有很多阐述 - 但它是必要的.

不确定有多少人知道这一点,但是,Visual Studio中的Razor代码编辑器会导致您的网站在Application_Start事件发生之前被"测试" - 这会导致我当前项目中出现一些恼人的问题, WebActivator做了很多网站初始化.

更新 - 仔细观察它不只是Razor - 它看起来像是Visual Studio范围内 - 因此标题的变化

我需要能够检测Visual Studio运行网站代码的时间,而不是网络服务器.

要演示 - 执行以下操作(完全按照书面形式确保其重现):

  • 创建一个新的MVC 4站点,我使用了Internet应用程序模板,因此创建了一些页面.
  • 从nuget添加WebActivator包
  • 将类添加到名为的App_Start文件夹中 RazorPageBugTest
  • 粘贴此代码(更改相关命名空间):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcApplication6.App_Start;
using System.IO;

[assembly: WebActivator.PreApplicationStartMethod(
  typeof(RazorPageBugTest), "Start", Order = 0)]

namespace MvcApplication6.App_Start
{
  public static class RazorPageBugTest
  {
    public static void Start()
    {
      using (var writer = File.Open(@"c:\trace.txt", FileMode.Create))
      {
        using (var tw = new StreamWriter(writer))
        {
          tw.AutoFlush = true;
          tw.WriteLine("Written at {0}", DateTime.Now);
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码通常不会在Web服务器上运行 - 因为它正在写入驱动器C :(如果您不以管理员身份运行VS,这可能无法在您的计算机上运行).

  • 现在构建项目.
  • 如果您已在C上打开资源管理器,则下一位效果最佳:完成后,找到Razor视图并打开它
  • 等待所有C#/ VB位突出显示
  • 看看驱动器C - 哦,看,有一个名为'trace.txt'的文件,日期在最后几秒内!

这就证明了这里的问题 - Razor代码编辑器正在启动AppDomain,并且有效地炮轰网站以获取智能感知(包括App_Helpers文件夹中的东西等).现在它实际上并没有触发该Application_Start方法 - 但是当你在项目中也有WebActivator时,它的任何预应用程序启动方法都会触发.

在我的情况下,这导致了巨大的问题 - 高CPU使用率和内存使用率devenv.exe(相当于刚刚启动的网站)因为我初始化了DI容器而且天知道此时还有什么,但特别是一个证明非常烦人.

我的网站有一个组件,可以在网络上侦听来自Web场中其他计算机的状态和缓存失效消息.在QA和Live环境中,这个监听器永远不会打开端口并监听 - 在我的开发机器上,然而,它经常失败 - 说端口已经在使用中.当我寻找持有它的过程时 - 它始终是devenv.exe.

你猜对了 - 我在一个WebActivator初始化的boot-strapping调用中启动了这个监听器.

所以问题是 - 有没有人知道一种方法来检测代码是不是由'正确'的web主机运行所以我可以阻止它运行?我对此特别抱有希望,因为这也意味着我的Visual Studio和Razor编辑体验将会更快地成为一个该死的网站!

作为奖励,任何修复都可以合法地发送给WebActivator的作者David Ebbo - 所以他可以在他的堆栈中更早地将其粘贴以防止问题完全发生!

更新

我刚刚在GitHub上的WebActivator页面上添加了一个问题,看看David Ebbo是否可以将我的修复程序或更好的修复程序推送到WebActivator组件中.

Dav*_*bbo 3

您无需编写自己的逻辑来检测这一点,只需使用System.Web.Hosting.HostingEnvironment.InClientBuildManager,这对于 VS 运行该代码以及在 aspnet_compiler.exe 中运行时都是如此。

有关于此的更多详细信息,请参阅此答案。