【问题标题】:Cannot run MVC4 project if not using standard output directory如果不使用标准输出目录,则无法运行 MVC4 项目
【发布时间】:2013-08-09 10:09:48
【问题描述】:

我的项目结构如下:


  • -- 类库 1
    -- 类库 2
    -- 网络项目
  • 垃圾箱
    -- 调试
    -- 发布

MVC4 Web 项目的默认输出目录是 .\Bin\(即在 Web 项目的目录中),但我将其更改为 ..\bin\debug\..\bin\release\ 之类的东西以适应我上面的项目结构。它可以正常编译,并且二进制文件会转到正确的位置。

但是当我运行该项目时,它会抱怨 Could not load type Myproject.MvcApplication,而如果我不进行上述更改,它就会起作用。

我如何控制二进制文件的位置? 我希望输出目录与源目录完全分开 - 因为我没有混合使用源代码和二进制文件在一个地方。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    简短的回答,你不能。它与 Visual Studio 甚至 .NET 无关,这是 IIS 限制。

    原因是 IIS 期望 bin 目录直接位于网站文件夹位置下。这是您无法绕过的安全机制。其目的是防止受感染的网站直接从站点的根目录“逃脱”。

    你为什么要这样做?

    【讨论】:

    • 因为我使用 msbuild,并且我从 msbuild 的输出 bin 目录中部署所有内容。而且因为我希望将源代码与二进制文件分开,所以我不会不小心将文件交给不应该拥有它们的人。
    • 我不认为这是一个问题。也许我必须做的是弄清楚,为方便起见,当我单击运行/调试按钮时,它如何从我的 msbuild 的 bin 目录而不是从项目的 bin 目录运行网站。我可以让 IIS Express 做到这一点吗?
    • @BobbyB - 你不能从 Bin 目录运行你的网站,它需要访问文件,如视图文件、javascript、图像等......这些都必须在根目录下,因此,如果您将 bin 目录设为根目录,则必须将整个网站结构复制到 bin 目录中。你真的没有道理。
    • 这很有意义 - msbuild 会自动将所有这些文件复制到输出目录,因此它绝对包含部署所需的所有内容。这是在持续集成系统中完成的,并且一切正常。由于您解释的原因,我只是无法让它在本地使用 IIS Express 运行(因为它假定项目目录是根目录)。
    • 我所谓的“bin”有不同的含义,但它确实有意义,我们将它用于大型系统 - 如果您愿意,可以将其称为输出目录。在那个目录中有一个实际的“bin”目录,其中除了 DLL 之外什么都没有(无论如何调试都不会在其中进行,仅在开发机器上进行)。我们的项目结构背后的逻辑是没有问题的,我是否可以让 IIS Express 从我想要的位置(而不是从 VS 中的项目文件夹)加载网站是个问题。我想这是不可能的。
    【解决方案2】:

    我也遇到了这个问题,考虑到调试和发布二进制文件的分离是标准做法,而且 MVC 有一个输出文件夹设置,这让人很想这样做,这是出乎意料和令人困惑的。可以这样做,请参阅here,但它有点难看。

    似乎在坚持 IIS 的期望与需要保持调试和发布分开并明确标记之间存在冲突。我认为目前的解决方案不能很好地满足这两种需求。调试和发布是构建时间考虑,坚持 IIS 是打包/部署时间,两者变得混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2023-03-22
      • 2017-03-09
      • 1970-01-01
      • 2019-10-03
      • 2018-02-02
      • 1970-01-01
      相关资源
      最近更新 更多