65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Linux 上创建和托管 ASP.NET Core 应用程序 — 无需第三方

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016 年 9 月 15 日

CPOL

12分钟阅读

viewsIcon

12612

在本文中,我将对在 Linux 环境下创建和托管 ASP.NET Core 应用程序进行全面的概述和解释 — 无需使用任何第三方插件或库。

引言和背景

我一直想写一些关于 ASP.NET Core 托管方面的内容,而 Kestrel 从我个人的角度来看很有意思。此前,我写了一堆文章来涵盖 ASP.NET Core 编程的基础知识,在这篇文章中,我将指导你如何使用在安装过程中下载的 .NET Core 库,在本地环境中托管 ASP.NET Core 应用程序。其次,我很久没有写任何东西了,可能我已经忘记了读者的兴趣,所以如果我遗漏了一些东西,请原谅。

image_60140ec0-ce46-4dbf-a14f-4210eab7f42c

图 1:截图来自 Scott Hanselman 的博客

今天这篇文章有很多内容要分享,所以请保持关注,屏住呼吸。我将在本文中涵盖以下步骤:

  1. 在 Linux 环境下安装最新版本的 .NET Core
    • 如果你已经安装了 .NET Core 框架,请升级你的系统,如果它目前不支持 ASP.NET 编程。
    • 在以前的版本中,.NET Core 不支持 Linux 操作系统的 Web 开发。在最近的版本中,它已经被添加到最新的版本中,这就是为什么我坚持认为,在继续之前,你至少要安装最新版本的 .NET Core。
  2. 在你的 Linux 环境下设置一个 ASP.NET Web 应用程序。
    • 我将指导你完成许多阶段,例如开发、编辑、维护以及使用 IDE 来完成所有这些工作。
    • 我将带你了解 ASP.NET Web 应用程序文件层级结构中的许多不同区域(*不是 ASP.NET 的区域!*),并且我会告诉你哪些是已有的,哪些即将发生变化(或可能在层级结构中发生变化)。
  3. 生成并运行项目。
    • 在本节中,我将为你提供一些有用的技巧。
    • 在运行之前,我会给你一个 Kestrel 的概述 — *ASP.NET 5 的 Web 服务器*。
    • 然后,我将继续使用这个网站,它在开发 ASP.NET Web 应用程序时,感觉与在 Windows 操作系统上一样。
    • 提示:我将给你一个提示,默认情况下,应用程序上传到 5000 端口,在许多情况下你需要更改它,我将向你展示如何更改 Web 应用程序托管服务的端口。
  4. 最后,我将转向在我写过的任何平台上的文章末尾都要写的最后几句话。

安装或升级 .NET Core

我写了一篇文章,介绍了如何在 Linux 环境中使用 .NET Core,你可以 在这里 阅读。那篇文章完全是为了让你了解 .NET Core 的架构,以及一些你可以用来完成大部分工作的命令。旧文章和本节的区别在于,本节将只安装一个较新版本的 .NET Core。而在上一篇文章中,你需要安装旧版本。

尝试以下命令

sudo apt-get update && dist-upgrade

如果这不起作用,或者没有显示更新,请访问 .NET Core 官方网站 ,并从那里安装最新版本。

创建一个新的 Web 应用程序

以前,.NET Core 只支持创建库或控制台应用程序。现在,它也支持 ASP.NET Web 应用程序开发,它也支持 ASP.NET 的模板,目前只是创建了一个简单的 ASP.NET MVC 导向的 Web 应用程序,我认为没有必要添加其他模板,如 Web API、SignalR、单页应用程序等。我认为目前这已经足够了。

要创建一个新的 Web 应用程序,在 .NET Core 中创建新项目,并将类型参数设置为 Web 应用程序,这将指导 .NET Core (dotnet) 使用 Web 应用程序模板创建一个新应用程序。

screenshot-3007

图 2:使用 Web 模板创建新的 .NET Core 项目。

正如你在上面的命令中看到的,我们向 `create` 命令传递了一个类型(`-t` 参数)来创建一个新的 Web 模板化应用程序。内容如下:

screenshot-3008

图 3:.NET Core 中的 ASP.NET Web 应用程序文件和目录。

该项目看起来与我们在 Windows 环境中的项目类似。只有一个区别:*它包含 web.config 和 project.json 文件*。请记住,Microsoft 大部分时间都在回归 MSBuild,当然一些托管模块是基于 IIS 服务器的,这就是为什么项目中存在 *web.config* 文件。然而,该项目目前使用 *project.json* 文件进行项目级别的配置,(正如我们最近经常听到的),这些将迁移到 MSBuild 的项目管理方式及其他相关事项。

编辑和更新 Web 应用程序

Microsoft 一直在不断突破界限,当然在 Linux 上你已经拥有了一些最好的开发工具,但 Visual Studio Code 仍然是一个更好的工具。在我之前的文章中,我说过我不喜欢它——我仍然不喜欢它太多,它需要改进!——但它比许多可用于 C# 或 .NET 相关编程的工具和 IDE 都要好。由于在这篇文章中,我说过我不会谈论任何第三方内容,所以 Visual Studio Code 是我将在此情况下推荐、支持和使用的工具。

你可以从其 官方网站 下载 Visual Studio Code,**请注意一点**,Debian 包安装需要一些时间,所以如果你也像我一样不喜欢等待太久,那么我建议你下载归档包并从它们安装 IDE。根本不需要安装,你只需将解压后的文件移动到你想要存储它的位置。最后,你创建一个指向可执行文件的符号链接,可以这样做:

sudo ls -s /home/username/Downloads/VSCode-linux-x64/code /usr/local/bin/code

这将创建一个链接,你可以在目录中的任何地方(使用终端)通过执行“code”命令来使用 Visual Studio Code IDE,它将把目录本身加载到 IDE 中,然后你可以用它来更新你的应用程序的源代码以及其他你想要的东西。

提示:从市场安装 C# 扩展 以获得更好的体验。

完成此操作后,转到你创建项目的目录。执行以下命令:

code .

这将触发 Visual Studio Code 将你的目录加载到 IDE 中作为项目。我的环境看起来是这样的:

screenshot-3009

图 4:Visual Studio Code 将默认的 ASP.NET 目录显示为一个项目。

其余的就如同历史——我的意思是其余的都是你在 Windows 环境中能够获得的类似的效果和感觉。首先,当你按照我的方式工作并遵循我的指导时,你会在 IDE 窗口中看到以下错误。

screenshot-3010

图 5:Visual Studio Code 中的错误消息。

我们稍后会修复它们。但首先,要理解它们就是这样工作的。如果你曾经用 .NET Core 进行过编程,你一定知道,在其他任何事情之前,你都需要先还原项目的 NuGet 包,然后才能构建项目。Visual Studio Code 使用相同的 IntelliSense,并尝试告诉你哪里出了问题。这样做,它需要二进制文件,而这些文件不可用,所以你会看到最后那个错误消息。上面的两个是可选的,中间的一个是稍微可选但必需的。

构建和运行项目

到目前为止,我们已经创建了项目。但现在,我们需要为项目*还原*依赖项,.NET Core 将使用这些依赖项来实际执行我们的代码。默认情况下,不会生成锁定文件,所以我们需要创建一个新文件,然后就可以构建项目了。

执行以下命令:

dotnet restore

在此之后,.NET Core 将自动生成锁定文件,并且可以轻松触发构建过程。

screenshot-3012

图 6:还原项目后创建的 project.lock.json 文件。

我们可以继续构建项目。我现在想让你注意这一点。看看会发生什么。

screenshot-3013

图 7:在 .NET Core 上构建和运行 ASP.NET Web 应用程序的过程。

现在注意上面终端窗口中的几点。首先,注意它一直在记录所有内容。其次,注意它附加了一个端口“5000”。我们并没有训练它使用该端口,而且它也没有来自 *Program.cs* 文件(*你可以查看该文件!*)。但在我深入解释如何更改它之前,我想让你赞美 Kestrel — *ASP.NET 5 的 Web 服务器*。Kestrel 是 libuv 异步 I/O 库的实现,它有助于在跨平台环境中托管 ASP.NET 应用程序。Kestrel 的文档和参考文档也可用,你可以在 ASP.NET Core 参考文档网站的 **Microsoft.AspNetCore.Server.Kestrel** 命名空间开始阅读 Kestrel 的大部分文档。

这是有趣的部分,因为 ASP.NET Core 甚至可以在一个最简化的 HTTP 监听器上运行,后者可以充当 Web 服务器。Kestrel 是一个新的 Web 服务器,它不是一个功能齐全的 Web 服务器,但会随着社区需求的变化而适应。目前它只支持 HTTP/1,但未来会支持其他功能。但**请记住**,将所有功能和模块塞进一个服务器实际上会扼杀使用 .NET Core 本身的主要目的。.NET Core 不是为了将所有东西都推到堆栈上而开发的,而是为了只使用必需的模块和功能。是的,如果你想添加一个功能,你可以自己修改代码并构建服务。它是开源的,托管在 GitHub 上。

更改应用程序的端口号

在许多情况下,你可能想更改服务器监听的端口号,或者你可能想让此服务器成为网络上所有基于 HTTP 的通信的默认服务器。在这种情况下,你必须有一个分配的特殊端口号(默认为 80)。

为此,请转到你的 *Program.cs* 文件,这是主程序文件(项目的 main 函数),它负责在 ASP.NET Core 环境中为你的 Web 应用程序创建一个托管包装器。此对象的当前内容是:

screenshot-3015

图 8:Program.cs 文件的源代码。

在这一连串的“Use”函数中,我们只需要再添加一个函数调用来使用一个特殊的 URL。“UseUrls(“”)” 函数将允许我们更新要用于此 Web 应用程序的 URL。所以我只是在这里使用这个函数,这样我们就可以简单地选择要使用的 URL(和端口)。

screenshot-3017

图 9:正在管理的 URL

现在,如果你尝试运行该应用程序,你会在 Linux 系统上遇到以下问题:

screenshot-3019

图 10:无法绑定到给定的 URL,错误消息。

这非常简单——*它没有执行此操作的权限*。所以,在 Linux 系统上,它是使用超级用户凭据和帐户执行的。

sudo dotnet run

它会提示你输入密码,输入你的密码,这次应用程序将在 `localhost:80` 上运行。在需要将网站上传到服务器、Azure App Services 等的情况下,你都需要应用程序在充当默认服务器的服务器下运行,所以在这些情况下,你必须处理用于请求的 HTTP 通信的默认 TCP 端口。否则,你可能需要处理 NGINX 或 Apache 服务器等的后端。但这又是另一回事了。

screenshot-3020

图 11:Web 服务器在 80 端口运行

现在我们的服务器正在运行,我们可以打开 Web 浏览器进行测试。我将使用 Firefox,你可以使用任何 Web 浏览器(*包括基于终端的*)。

screenshot-3021

图 12:在 Firefox 中呈现的 ASP.NET Core Web 应用程序,在 Linux 上使用 Kestrel Web 服务器运行。

如你所见,Web 应用程序运行得很顺利。此外,它还会记录发生的任何事件。终端会记录下来,它还可以让你将主终端的输出传输到文件流中以存储所有内容。但这又是另一篇文章的主题了。

screenshot-3022

图 13:终端窗口中的 ASP.NET Web 应用程序日志。

随着请求的到来和响应的生成,这个窗口将会有越来越多的内容。

结束语

我一直想为我自己的博客等写我自己的下一个 Web 应用程序,使用 ASP.NET Core。目前,该框架“**几乎**”准备好用于生产环境,但还没有。也许在接下来的几个版本中,它就可以准备好了。还有很多事情需要他们关注。例如,Web 服务器需要更敏捷——需要提供功能。不仅如此,Visual Studio Code 必须与 ASP.NET Core 工具完全集成。目前,它只允许我们编辑代码,然后我们必须回到终端来完成其余的工作。它应该提供这方面的能力。

致 .NET Core 团队:为什么 .NET Core 不发布到 Linux?我非常确定该框架功能齐全,尽管有 bug。但主要的 .NET Framework 也有 bug,这里那里有一些小问题。我这里的主要关注点是能够“sudo apt-get install dotnet”。我记不清更长的版本名称了。

致读者:如果你愿意在生产应用程序中使用 ASP.NET Core,请稍等片刻。尽管 ASP.NET Core 是比许多其他可用解决方案更好的解决方案,但我自己的建议是,目前坚持使用 ASP.NET 4.6,因为它与当前版本相比是一个更稳定的版本。

© . All rights reserved.