ASP.NET 项目 Web Site Project 与 Web Application Project 的区别详解



在软件开发中,项目模型决定了我们如何组织代码、如何编译程序以及如何部署应用,ASP.NET 的项目模型有两种:Web Site Project (WSP) 和 Web Application Project (WAP)。下边我们举个例子说明项目模型的作用以及它们的区别。

例如在一个页面中输出字符“hello, world”,当使用 WSP 模型时,文件可能是这样的:

Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true"
         CodeBehind="HelloWorld_CodeBehind.aspx.cs"
         Inherits="HelloWorld_CodeBehind" %>

<!DOCTYPE html>
<html>
<head>
    <title>Hello World - 代码分离</title>
</head>
<body>
    <form id="form1" runat="server">
        <!-- 用 Label 控件展示后台赋的值 -->
        <asp:Label ID="lblMessage" runat="server"></asp:Label>
    </form>
</body>
</html>

Default.aspx.cs:

using System;

public partial class HelloWorld_CodeBehind : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // 在页面加载时为 Label 赋值
        lblMessage.Text = "hello, world.";
    }
}

若使用 WAP 模型,除了上面两个文件,通常还会多一个文件Default.aspx.designer.cs:

// 此文件由 Visual Studio 自动生成,请勿手动修改
public partial class HelloWorld {

    /// <summary>
    /// form1 控件。
    /// </summary>
    protected global::System.Web.UI.HtmlControls.HtmlForm form1;

    /// <summary>
    /// lblMessage 控件。
    /// </summary>
    protected global::System.Web.UI.WebControls.Label lblMessage;
}

为什么要多这么一个文件呢?根源就在于编译方式的不同:

Web Site Project (WSP) 模型:采用服务器端动态编译方式,页面第一次被访问时才编译,ASP.NET 运行时会根据 .aspx 里的 runat="server" 控件,在后台自动生成一套临时的声明代码,然后合并编译,所以你可以没有 .designer.cs,甚至 .cs 文件里都不用写声明,运行时不会报错,因此部署时能实现像 PHP 一样 “改完即上传、上传即生效” 的体验。

Web Application Project (WAP) 模型:采用本地预编译方式,所有 .cs 业务代码,必须提前编译为 bin 目录下的 .dll 程序集,例如编译器在编译 HelloWorld.aspx.cs 时,需要知道 lblMessage 这个变量是哪里来的、是什么类型,否则编译时就会报错:“当前上下文中不存在名称 lblMessage”。这样在编译阶段就能发现错误,而不是等到运行时才报错。

回顾 ASP.NET 的发展史,WSP 模型在早期降低了 Web 开发的门槛,然而,随着互联网应用越来越复杂,WAP 模型所代表的强类型、预编译、工程化优势逐渐显现。因此,在 .NET Framework 时代,开发者可以自由选择创建 WSP 或 WAP 项目,从 .NET Core 开始,微软已经彻底摒弃了 WSP 模型。

上一篇: ASP.NET 项目中 aspx 页面内联代码和代码分离演示示例
下一篇: 这是最新一篇日志
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 24
发表评论
登录后再发表评论!