# ASP.NET Core 教程

> 原文： [https://zetcode.com/articles/aspnetcore/](https://zetcode.com/articles/aspnetcore/)

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](https://www.vkinfotek.com/asp-core-erp-software-contents.html) 开发 ERP 软件中找到有关 ASP.NET Core 的更多信息。

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

## ASP.NET Core 功能

以下是 ASP.NET Core 的主要功能：

*   带有 NuGet 包的模块化设计
*   跨平台开发
*   开源和基于社区
*   云端架构
*   内置依赖注入
*   与流行的前端技术集成

## 安装.NET Core CLI 工具

第一步是为您的操作系统安装.NET Core 命令行工具。 在 Github [存储库](https://github.com/dotnet/cli)上可以找到安装说明。

```cs
$ 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 添加了一个新的非官方存储库。

```cs
$ sudo apt-get install dotnet-dev-1.1.0

```

我们安装`dotnet`命令行工具。

## .NET Core 控制台应用

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

```cs
$ 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`

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

```

这是项目配置文件。

`Program.cs`

```cs
using System;

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

```

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

```cs
$ dotnet restore

```

使用`dotnet restore`命令，下载必要的依赖项。 它调用 NuGet（.NET 包管理器）以还原依赖关系树。 NuGet 将分析`consapp.csproj`文件，下载文件中所述的依赖项（或从计算机上的缓存中获取它们），然后写入`obj/project.assets.json`文件。 `project.assets.json`文件是编译和运行程序所必需的。

```cs
$ 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`命令来构建程序。

```cs
$ dotnet run
Console application

```

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

## Visual Studio 代码

Visual Studio Code 是 Microsoft 为 Windows，Linux 和 MacOS 开发的源代码编辑器。 它包括对调试，嵌入式 Git 控制，语法突出显示，智能代码完成，代码段和代码重构的支持。 它可以用于开发 ASP.NET Core 应用。 可以从[网页](https://code.visualstudio.com)下载 Visual Studio 代码。

如果选择 Visual Studio Code，则还需要安装 OmniSharp C# 扩展。

## ASP.NET Core 应用

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

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

```

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

```cs
$ cd SimpleApp
$ dotnet restore

```

我们使用`dotnet restore`命令恢复包。

`Program.cs`

```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 服务器。 `Build`和`Run`方法构建了`IWebHost`对象，该对象将托管应用并开始监听传入的 HTTP 请求。 主机是 Web 服务器的包装器。

`WebHostBuilder`上的`UseStartup`方法为您的应用指定启动类。 `Startup`类必须是公共类，并且必须具有两个方法：`ConfigureServices`和`Configure`。 `ConfigureServices`定义了诸如 MVC 框架或 Entity Framework Core 之类的服务。 `Configure`定义了请求管道中的中间件。 中间件是一个处理请求和响应的应用组件。

`Startup.cs`

```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`类以简单消息响应请求。

```cs
loggerFactory.AddConsole();

```

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

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

```

在开发模式下，我们使用开发者异常页面。

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

```

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

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

```

我们使用`dotnet run`命令运行该应用。 该应用已启动，将在端口 5000 上监听。

```cs
$ curl localhost:5000
Hello there

```

我们使用`curl`工具创建了一个请求，应用以文本消息响应。

## ASP.NET Core MVC 应用

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

模型-视图-控制器（MVC）架构模式将应用分为三个区域：模型，视图和控制器。 该模式有助于建立关注点分离。

```cs
$ dotnet new web -o WebApp
$ cd WebApp

```

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

```cs
$ mkdir Views Controllers

```

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

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

```

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

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

```

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

`WebApp.csproj`

```cs
<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`构建文件。

```cs
$ dotnet restore

```

We restore the packages with `dotnet restore` command.

`Program.cs`

```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`

```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，静态文件并设置路由。

```cs
services.AddMvc();

```

使用`AddMvc`，我们将 MVC 中间件添加到应用中。

```cs
app.UseDefaultFiles();
app.UseStaticFiles(); 

```

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

```cs
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`

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

```

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

`HelloController.cs`

```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`

```cs
<!DOCTYPE html>
<html> 
   <head> 
      <title>Home</title> 
   </head>

   <body> 
      <h1>Welcome!</h1> 

      <div> 
         @ViewBag.message
      </div> 
   </body> 

</html> 

```

`Views/Hello`中的`Index.cshtml`是`Index`操作的视图。 它显示来自`ViewBag`的消息。

![Displaying message](img/9bac5b975555b7a500839c1dc69744fe.jpg)

图：显示消息

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

您可能也对以下相关教程感兴趣： [C# 教程](/lang/csharp/)， [C# 中的日期和时间](/articles/csharpdatetime/)，[用 C# Mono 读取网页](/articles/csharpreadwebpage/)和 [C# Winforms 教程](/gui/csharpwinforms/)。