ASP.NET网站或ASP.NET Web应用程序?


Answers

网站是您部署到ASP.NET Web服务器(如IIS)的内容。 只是一堆文件和文件夹。 网站中没有任何内容将您与Visual Studio联系在一起(没有任何项目文件)。 代码生成和编译网页(如.aspx,.ascx,.master)是在运行时动态完成的,对这些文件的更改由框架检测并自动重新编译。 你可以把你想要在两个页面之间共享的代码放到特殊的App_Code文件夹中,或者你可以预编译它并把程序集放到Bin文件夹中。

Web应用程序是一个特殊的Visual Studio项目。 与Web站点的主要区别在于,当您构建项目时,所有的代码文件都被编译到一个单独的程序集中,该程序集位于bin目录中。 您不要将代码文件部署到Web服务器。 您可以将它们放在任何位置,而不必像共享代码文件那样使用特殊文件夹。 由于Web应用程序包含不想部署的文件(如项目和代码文件),因此Visual Studio中有一个“ 发布”命令,用于将Web站点输出到指定的位置。

App_Code vs Bin

部署共享代码文件通常是一个坏主意,但这并不意味着您必须选择Web应用程序。 您可以有一个网站,引用一个类库项目,其中包含网站的所有代码。 Web应用程序只是一个方便的方法。

代码隐藏

本主题特定于.aspx和.ascx文件。 本主题在新的应用程序框架(如不使用代码隐藏文件的ASP.NET MVC和ASP.NET Web页面)中逐渐减少。

通过将所有代码文件编译为单个程序集,包括.aspx页面和.ascx控件的代码隐藏文件,在Web应用程序中,您必须重新构建每个小改动,而且不能进行实时更改。 在开发过程中,这可能是一个真正的痛苦,因为您必须不断重新构建以查看更改,而Web站点更改由运行时检测到,并且页面/控件将自动重新编译。

使用运行时管理代码隐藏程序集对于您来说工作较少,因为您不必担心为页面/控件赋予唯一的名称,或将它们组织到不同的名称空间中。

我并不是说部署代码文件总是一个好主意(特别是不是在共享代码文件的情况下),但代码隐藏文件应该只包含执行特定于UI的任务,线程事件处理程序等的代码。您的应用程序应该是分层,以便重要的代码总是在Bin文件夹中。 如果是这种情况,那么部署代码隐藏文件不应该被认为是有害的。

Web应用程序的另一个限制是您只能使用该项目的语言。 在Web站点中,您可以在C#中使用一些页面,在VB中使用一些页面等。不需要特殊的Visual Studio支持。 这是构建提供程序可扩展性的优点。

此外,在Web应用程序中,由于编译器仅编译代码隐藏类,而不是编译代码(在MVC中,您可以使用MvcBuildViews选项修复此问题),因此在运行时编译时不会在页面/控件中检测到错误。

视觉工作室

由于Web应用程序是Visual Studio项目,因此您将获得Web站点中不可用的一些功能。 例如,您可以使用构建事件来执行各种任务,例如缩小和/或组合JavaScript文件。

在Visual Studio 2010中引入的另一个不错的功能是Web.config转换 这在网站中也是不可用的。 现在在VS 2013中使用网站。

构建Web应用程序比构建Web站点要快,特别适用于大型站点。 这主要是因为Web应用程序不编译标记代码。 在MVC中,如果您将MvcBuildViews设置为true,那么它将编译标记代码,并获得错误检测,这非常有用。 不利的一面是,每当您构建解决方案时,都会构建完整的网站,这可能会很慢且效率低下,特别是在您未编辑网站时。 我发现自己打开和关闭MvcBuildViews(这需要一个项目卸载)。 另一方面,通过网站,您可以选择是否将网站构建为解决方案的一部分。 如果您选择不这样做,那么构建解决方案的速度非常快,您可以随时单击“网站”节点,然后选择“构建”(如果已经进行了更改)。

在一个MVC Web应用程序项目中,您可以为常见任务添加额外的命令和对话框,如“添加视图”,“转到视图”,“添加控制器”等。这些在MVC网站中不可用。

如果使用IIS Express作为开发服务器,则可以在Web站点中添加虚拟目录。 该选项在Web应用程序中不可用。

NuGet软件包还原在网站上不起作用,您必须手动安装packages.config中列出的软件包 Package Restore现在可以在网站上启动NuGet 2.7

Question

当我在Visual Studio中启动一个新的ASP.NET项目时,我可以创建一个ASP.NET Web应用程序,或者我可以创建一个ASP.NET Web站点。

ASP.NET Web应用程序和ASP.NET网站有什么区别? 为什么我会选择其中一个呢?

答案根据我使用的是哪个版本的Visual Studio而不同?




Web应用程序项目模型

  • 提供与Visual Studio .NET Web项目相同的Web项目语义。 有一个项目文件(基于项目文件的结构)。 构建模型 - 项目中的所有代码都被编译成一个程序集。 支持IIS和内置的ASP.NET开发服务器。 支持Visual Studio 2005(重构,泛型等)和ASP.NET(主页,成员和登录,网站导航,主题等)的所有功能。 使用FrontPage服务器扩展(FPSE)不再是一个要求。

网站项目模型

  • 没有项目文件(基于文件系统)。
  • 新的编译模式。
  • 动态编译和在页面上工作,而无需在每个页面视图上构建整个站点。
  • 支持IIS和内置的ASP.NET开发服务器。
  • 每个页面都有自己的程序集。
  • 不同的代码模型。



一个“网站”的代码在一个特殊的App_Code目录下,并且在运行时被编译成几个DLL(程序集)。 一个“Web应用程序”被预编译成一个单独的DLL。




在Web应用程序项目中,Visual Studio需要额外的页面和用户控件的.designer文件。 网站项目不需要这种开销。 标记本身被解释为设计。




这取决于你正在开发的东西。

内容导向型网站的内容会经常变化,而网站则会更好。

应用程序倾向于将其数据存储在数据库中,而其页面和代码很少会发生更改。 在这种情况下,最好有一个Web应用程序,在这个应用程序中,组件的部署更加可控,并且对单元测试有更好的支持。




网站 - 没有解决方案文件将被创建。 如果我们要创建网站,不需要Visual Studio。

Web应用程序 - 将创建一个解决方案文件。 如果我们要创建Web应用程序,应该需要Visual Studio。 它会在bin文件夹中创建一个.dll文件。




其中一个主要区别是网站动态编译并创建即时组件。 网络应用程序编译成一个大的程序集。

两者之间的区别已经在Visual Studio 2008中取消了。




Web应用程序需要更多的内存,大概是因为你别无选择,只能编译成一个程序集。 我只是将一个大的遗留网站转换为一个Web应用程序,并且在编译时使用

Unexpected error writing metadata to file '' -- 
Not enough storage is available to complete this operation. 

错误,并在运行时出现此错误:

Exception information: 
    Exception type: HttpException 
    Exception message: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Web.Compilation.BuildManager.ReportTopLevelCompilationException()

我建议在内存受限的传统硬件上转换较大的网站是让自己选择恢复到网站模式。 即使在最初的成功之后,问题可能会在稍后蔓延。




这可能听起来有点明显,但我认为这是误解,因为Visual Studio 2005最初只与网站一起提供。 如果您的项目处理的网站相当有限,并没有太多的逻辑或物理分离,网站是好的。 但是,如果它真的是一个具有不同模块的Web应用程序,许多用户添加和更新数据,那么最好使用Web应用程序。

网站模型最大的app_codeapp_code部分中的任何内容都是动态编译的。 您可以在不进行完全重新部署的情况下进行C#文件更新。 然而,这是一个很大的牺牲。 很多事情发生在难以控制的封面之下。 由于一切都是动态编译的,名称空间很难控制,并且默认情况下,特定的DLL使用情况会在app_code任何地方出现。

Web应用程序模型没有动态编译,但您可以控制我提到的事情。

如果您正在进行多层开发,我强烈建议使用Web应用程序模型。 如果您正在进行有限的网站或快速而肮脏的实施,则网站模型可能具有优势。

更详细的分析可以在:




绝对的Web应用程序,单个DLL文件,易于维护。 但是一个网站更加灵活; 你可以在旅途中编辑aspx文件。




应用程序通常在部署之前进行编译,因为网站使用app_code目录。 当应用程序代码文件夹中的任何内容发生变化时,服务器将重新编译代码。 这意味着您可以随时在网站上添加/更改代码。

一个应用程序的优点是没有重新编译,所以初始启动时间会更快。




除非您特别需要动态编译的项目, 否则请勿使用网站项目

为什么? 因为网站项目会在您尝试更改或理解您的项目时将您推上墙。 Visual Studio中的静态类型查找功能(例如,查找用法,重构)将永远在任何合理大小的项目上运行。 有关更多信息,请参阅Visual Studio中的“查找所有引用”缓慢的堆栈溢出问题。

我真的不明白为什么他们放弃了Visual Studio 2005中的Web应用程序,因为这个网站的工作类型是令人痛苦的,完整的,生产力高的网站项目类型。