Visual Studio发布Web对话需要花费过多时间来加载

时间:2015-09-29 14:14:27

标签: visual-studio visual-studio-2013 dialog visual-studio-2015 web-publishing

每当我为特定的项目启动Visual Studio 2015发布Web对话(或Visual Studio 2013,两者都有相同的问题)时,它需要大约20-30秒才能打开。同样,当我在发布配置文件之间切换时,当我切换到特定的时,它需要相同的时间。当我切换到列表中的配置文件A(来自配置文件B)时,它需要与启动对话本身时相同的时间。当我从配置文件A切换到配置文件B时,它根本不需要任何时间。

有没有人对此有任何想法?仅在这个问题上我每天就会失去20-30分钟的开发时间。

我已检查过两个配置文件中的XML(.pubxml),除了服务器上站点的名称和Web.config SQL字符串转换结果外,它们是相同的。 (它们都发布到相同的服务器端点,两者都预编译了所有页面/控件设置为一个程序集,唯一的区别是配置文件的名称和站点的名称。)< / p>

我还检查了个人资料.user文件,两个再次相同。我不知道这里可能出现什么问题。

请注意,发布不需要花费很多时间。配置文件A需要与配置文件B一样长。

此外,在我完全重新安装Windows之前,即使在我的旧Visual Studio 2015安装中也存在此问题。 (当我升级到Windows 10时,我确实重新安装了Windows 。)

我对所有想法持开放态度,我可能会重新安装Visual Studio 2015 再次以查看问题是否消失。

进一步说明:在加载对话框时,它将Visual Studio完全锁定

更新:完全重新安装Visual Studio并没有解决问题。

另一个更新:打开对话框时,Visual Studio偶尔会崩溃。

1 个答案:

答案 0 :(得分:15)

TL; DR:作为此问题的解决方法,找到继承自DbContext的{​​{1}}类,并将基类构造函数从IdentityDbContext<>更改为{解决方案中的{1}}和执行完全重建。这将禁用对Entity 1.0.0的检查,这会导致从Publish Web运行时超时。

调试结果:多次调试之后,我们找到了根本原因。

  1. 当您在项目中使用Code-First运行发布Web时,它会想要枚举可用的连接字符串以检测您的数据库。
  2. 要做到这一点,它会调用你的base("DefaultConnection")类,用反射定位它并在VisualStudio的过程中调用它。
  3. 不幸的是,由于它是在VisualStudio中执行的,base("DefaultConnection", false)将使用DbContext而不是ConnectionManager,因此忽略了devenv.exe.config及其连接字符串。
  4. 只要您以web.configit will call web.config的形式致电IdentityDbContext<>,(根据第二个参数)will try to detect是否您的数据库使用Identity 1.0.0架构。
  5. 为了做到这一点,它会尝试连接到您的数据库,由传递给base("DefaultConnection")的连接名称标识(通常是base("DefaultConnection", true)
  6. 由于未加载IdentityDbContext<>,因此具有此名称的连接字符串将不可用。
  7. 对于不可用的连接字符串,实体将调用"DefaultConnection"。同样,您无法自定义它,因为未加载web.config。默认情况下,DefaultConnectionFactory将尝试使用web.config =您的连接名称连接到DefaultConnectionFactory,可能会产生以下连接字符串:

    .\SQLEXPRESS
  8. 如果您没有安装SQL Express,那将导致SQL异常,这将尝试连接,直到超时到期为止。

  9. 因此,罪魁祸首是Publish Web,它通过反射错误地运行程序集而不加载相应的Initial Catalog

    我们已经开始调试配方: 让我们看看里面发生了什么。

    1. 在冻结期间进行一些转储(假设每2-3秒进行一次转储)。要进行转储,我认为最简单的方法是:下载&amp;运行SysInternals Process Explorer,然后使用Data Source=.\SQLEXPRESS;Initial Catalog=DefaultConnection;Integrated Security=True;MultipleActiveResultSets=True
    2. 分析转储。最简单的方法是使用OSR's instant analyze
    3. 检查转储中的堆栈(从分析结果中的web.config开始)
    4. 堆栈上的函数名称已经可以告诉你出了什么问题。
    5. 如果本指南对您没有帮助,我需要亲自查看转储。请注意,转储将包含VS的部分内存,其中可能包含一些个人信息,例如文件路径。
    6. <强>更新

      现在OSR的分析无法分析转储中的堆栈,我们似乎必须这么做。

      一次性准备

      1. 安装Context Menu on Visual Studio's process | Create Dump | Create Minidump...作为Windows SDK的一部分(清除所有其他复选框,不安装您不需要的内容)
      2. 从已安装的软件包
      3. 运行STACK_TEXT
      4. Debugging Tools For Windows

        WinDBG (X86)
      5. File | Symbol File Path...

      6. 分析转储

        1. 在WinDBG中,按srv*C:\Symbols*http://msdl.microsoft.com/download/symbols 并打开转储。
        2. 在底部的编辑框中,写下File | Save workspace并按Enter键。
        3. 检查堆栈。