ZetCode

ASP.NET Core

最后修改于 2020 年 7 月 13 日

ASP.NET Core 教程是 ASP.NET Core 框架的入门教程,该框架用于在 C# 中构建跨平台 Web 应用程序。本教程使用 ASP.NET Core 框架 1.1.0 版本。

ASP.NET Core

ASP.NET Core 是一个跨平台、高性能、开源框架,用于构建现代的、基于云的、互联网连接的应用程序。ASP.NET Core 是对传统 ASP.NET 框架的重新设计。您可以在 使用 ASP Core 开发 ERP 软件 一书中找到更多关于 ASP.NET Core 的信息。

ASP.NET Core 应用程序可以在 Windows、Linux 和 Mac 上运行。

ASP.NET Core 特性

以下是 ASP.NET Core 的主要特性:

安装 .NET Core CLI 工具

第一步是为您的操作系统安装 .NET Core 命令行工具。安装说明可在 Github 仓库中找到。

$ sudo sh -c 'echo "deb [arch=amd64] http://apt-mo.trafficmanager.net/repos/dotnet/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
$ sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
$ sudo apt-get update

我们向 Ubuntu 添加一个新的非官方存储库。

$ sudo apt-get install dotnet-dev-1.1.0

我们安装 dotnet 命令行工具。

.NET Core 控制台应用程序

我们通过在 C# 中创建一个简单的控制台应用程序来测试安装。

$ dotnet new console -o consapp
Content generation time: 247.1035 ms
The template "Console Application" created successfully.
$ cd consapp/
$ ls
consapp.csproj  Program.cs

使用 dotnet 命令,我们创建一个新的控制台应用程序项目。

consapp.csproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
</Project>

这是项目配置文件。

Program.cs
using System;

namespace consapp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Console application");
        }
    }
}

这是一个简单的 C# 程序。

$ dotnet restore

使用 dotnet restore 命令,我们下载必要的依赖项。它调用 NuGet(.NET 包管理器)来恢复依赖项树。NuGet 分析 consapp.csproj 文件,下载文件中声明的依赖项(或从您机器上的缓存中获取它们),并写入 obj/project.assets.json 文件。project.assets.json 文件是编译和运行程序所必需的。

$ dotnet build
Microsoft (R) Build Engine version 15.1.1012.6693
Copyright (C) Microsoft Corporation. All rights reserved.
  consapp -> /home/janbodnar/prog/dotnet/consapp/bin/Debug/netcoreapp1.1/consapp.dll
Build succeeded.
    0 Warning(s)
    0 Error(s)
Time Elapsed 00:00:06.34

我们使用 dotnet build 命令构建程序。

$ dotnet run
Console application

最后,我们使用 dotnet run 运行程序。

Visual Studio Code

Visual Studio Code 是由 Microsoft 为 Windows、Linux 和 MacOS 开发的源代码编辑器。它包括对调试、嵌入式 Git 控制、语法高亮、智能代码完成、代码片段和代码重构的支持。它可用于开发 ASP.NET Core 应用程序。Visual Studio Code 可以从其 网页 下载。

如果我们选择 Visual Studio Code,我们还需要安装 OmniSharp C# 扩展。

ASP.NET Core 应用程序

在以下应用程序中,我们创建一个简单的 ASP.NET Core 应用程序。

$ dotnet new web -o SimpleApp
Content generation time: 221.9237 ms
The template "ASP.NET Core Empty" created successfully.

使用 dotnet new web 命令创建一个新的 Web 应用程序。

$ cd SimpleApp
$ dotnet restore

我们使用 dotnet restore 命令还原包。

Program.cs
using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace SimpleApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

ASP.NET Core 应用程序是一个控制台应用程序,在其 Main 方法中创建一个 Web 服务器。我们创建一个 Web 应用程序主机。它使用 Kestrel Web 服务器。BuildRun 方法构建将托管应用程序并开始侦听传入 HTTP 请求的 IWebHost 对象。主机是 Web 服务器的包装器。

WebHostBuilder 上的 UseStartup 方法指定应用程序的 Startup 类。Startup 类必须是 public 的,并且必须有两个方法:ConfigureServicesConfigureConfigureServices 定义服务,例如 MVC 框架或 Entity Framework Core。Configure 定义请求管道中的中间件。中间件是处理请求和响应的应用程序组件。

Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace SimpleApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env,
                ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello there");
            });
        }
    }
}

Startup 类使用简单的消息响应请求。

loggerFactory.AddConsole();

我们添加一个控制台记录器。

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}

在开发模式下,我们使用开发人员异常页面。

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello there");
});

我们向请求添加一个最终处理程序。该处理程序使用文本消息进行响应。WriteAsync 创建一个特定的线程来处理请求。WriteAsync 方法使用 UTF-8 将给定的文本异步写入响应正文流。

$ dotnet run
Hosting environment: Production
Content root path: /home/janbodnar/prog/dotnet/SimpleApp
Now listening on: https://:5000
Application started. Press Ctrl+C to shut down.

我们使用 dotnet run 命令运行应用程序。应用程序已启动,将在端口 5000 上侦听。

$ curl localhost:5000
Hello there

我们使用 curl 工具创建一个请求,应用程序使用文本消息进行响应。

ASP.NET Core MVC 应用程序

在下一个应用程序中,我们设置一个使用 MVC 模式的 ASP.NET Core 应用程序。

Model-View-Controller (MVC) 架构模式将应用程序分为三个区域:模型、视图和控制器。该模式有助于建立关注点分离。

$ dotnet new web -o WebApp
$ cd WebApp

我们创建一个 ASP.NET Core 应用程序。

$ mkdir Views Controllers

我们为视图和控制器创建两个目录。

$ dotnet add package Microsoft.AspNetCore.Mvc -v 1.1.3

我们将 Microsoft.AspNetCore.Mvc 包添加到项目中。

$ dotnet add package Microsoft.AspNetCore.StaticFiles -v 1.1.2. This
package adds support for MVC.

我们将 Microsoft.AspNetCore.StaticFiles 包添加到项目中。此包添加了处理静态文件的能力。

WebApp.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.2" />
  </ItemGroup>
</Project>

引用已添加到 WebApp.csproj 构建文件中。

$ dotnet restore

我们使用 dotnet restore 命令还原包。

Program.cs
using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace WebApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

我们设置 Web 应用程序主机。UseContentRoot 方法指定 Web 主机要使用的内容根目录。内容根目录是应用程序使用的任何内容的基本路径,例如其视图和 Web 内容。

Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
                ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            app.UseDefaultFiles();
            app.UseStaticFiles();            

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "hello",
                    template: "{controller=Hello}/{action=Index}/");    
            });
        }
    }
}

Startup 中,我们启用 MVC、静态文件并设置路由。

services.AddMvc();

通过 AddMvc,我们将 MVC 中间件添加到应用程序。

app.UseDefaultFiles();
app.UseStaticFiles(); 

我们设置静态文件。静态文件将从 wwwroot 目录提供。

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "hello",
        template: "{controller=Hello}/{action=Index}/");    
});

通过 UseMvc,我们设置路由。路由是将请求 URL 解析为控制器处理程序的过程。控制器名为 HelloController。操作名称为 Index,它是 HelloController 中的方法名称。操作的名称也由视图共享,该视图将被称为 Index.cshtml。该视图位于 Views/Hello 子目录中。ASP.NET Core 使用约定优于配置,其中许多设置都是推断出来的,不需要显式声明。

index.html
<!DOCTYPE html>
<html>
<body>
    <p>
        <a href="Hello?name=Peter&age=23">Get hello message</a>
    </p>
</body>
</html>

这是主页。它包含一个链接,该链接将两个参数发送到 Hello 控制器。HTML 文件位于 wwwroot 目录中。

HelloController.cs
using Microsoft.AspNetCore.Mvc;
using System;

namespace WebApp.Controllers {

   public class HelloController : Controller {

      public ViewResult Index(string name, int age) {

          string msg = String.Format("Hello {0}, you are {1} years old", name, age);

          ViewBag.message = msg;
          return View();
      }
   }
}

控制器包含 Index 方法,该方法被调用以响应请求。它的两个参数会自动映射到请求参数(约定优于配置)。该方法构建一条消息字符串并将其添加到 ViewBag 中。ViewBag 是一个简单的对象,可用于将数据从控制器传输到视图。

当操作返回视图时,会发生一个名为视图发现的过程。视图名称是从操作的名称推断出来的。

Index.cshtml
<!DOCTYPE html>
<html> 
   <head> 
      <title>Home</title> 
   </head>

   <body> 
      <h1>Welcome!</h1> 
      
      <div> 
         @ViewBag.message
      </div> 
   </body> 

</html> 

位于 Views/Hello 中的 Index.cshtmlIndex 操作的视图。它显示来自 ViewBag 的消息。

Displaying message
图:显示消息

在本教程中,我们介绍了 ASP.NET Core 框架。我们创建了两个简单的 ASP.NET Core 应用程序。