是否可以在没有 .NET Core 运行时或 sdk 的情况下托管 ASP.NET MVC 应用程序?

时间:2021-07-15 20:22:49

标签: asp.net .net asp.net-mvc asp.net-core .net-core

我正在努力理解所有这些框架如何交互和相互依赖:.NET Core、.NET Framework、ASP.NET Core、MVC 等。

This discussion 让我相信我的 MVC 应用程序使用 ASP.NET Core 和 .NET Framework,而不是 .NET Core。如果这是真的,我可以在没有 .NET Core 运行时的情况下运行 MVC 应用程序吗?如果不是,为什么这个应用仍然依赖于 .NET Core 运行时?

我的尝试

我在 Visual Studio 2017 中创建了一个新项目,如下所示:

  • ASP.NET Core Web 应用程序
  • MVC
  • .NET 框架
  • ASP.NET 核心 2.1

我发布的应用如下:

  • dotnet publish --self-contained false(防止包含运行时)
  • 使用 windows server 2019 部署新的 ec2 实例
  • 安装最少的依赖项集(IIS、.NET Framework、重写模块)
  • 将发布的应用部署到 IIS

该应用程序此时无法运行。我收到了错误代码为 500.190x8007000d。我通过安装 Hosting Bundle 让它工作。我手动删除了一些随托管包安装的东西,发现需要“Microsoft .NET Core 2.1.28 - Windows Server Hosting”。我不知道那到底是什么,但我觉得这里好像涉及到 .NET Core 运行时。

更新

当我安装 Hosting Bundle 时,我看到安装了一些重要的东西:

C:\Program Files\dotnet\dotnet.exe
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All\
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\
C:\Program Files\dotnet\shared\Microsoft.NETCore.App\

当我卸载 .NET Core Runtime 时,我只剩下以下内容:

C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All\
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\

此时该应用程序仍然有效。我假设剩下的是 ASP.NET Core 运行时,它与 .NET Core 运行时不同。我只是想确认此应用程序仅依赖于 ASP.NET Core 运行时和 .NET Framework,而完全不依赖于 .NET Core。

1 个答案:

答案 0 :(得分:0)

我们有一个系统,有CPU、内存、磁盘、网卡、IO设备等,我们需要一个软件来为我们管理这些资源,让我们使用这个系统。该软件是内核。 (比如 Linux)

既然我们可以控制硬件,我们需要在它之上进行抽象以供用户日常使用。我们需要 shell、窗​​口系统、不同类型的服务和守护进程。我们称这整个包为操作系统。 (比如 Ubuntu)

现在我们可以愉快地使用我们的计算机了,我们想为我们的问题或其他人的问题编写我们自己的应用程序。操作系统为我们提供了一种编程语言以及一个函数库和系统调用,我们可以使用它们来创建软件,就像操作系统本身使用它们一样。 (比如 C 和 glibc

突然我们意识到我们的软件不能移植到其他操作系统,而且它有很多复杂的样板代码。所以我们创建了一种新的编程语言并提供了一组新的库函数,但这次更容易阅读和理解。 (比如 C# 和 .NET 5 SDK)

但是我们遇到了问题。我们的操作系统无法理解这种新语言。所以我们需要在我们的语言和操作系统之间有一个层。这个软件必须读取我们的程序并以某种方式为操作系统翻译它。这个程序是运行时。 (比如 .NET 5 运行时)

enter image description here

好的,让我们回顾一下。我们使用 C# 和 .NET 创建了一个应用程序。这会产生一个使用 IL 语言的程序。操作系统不理解 IL 语言,因此我们需要 .NET 运行时来读取我们的 IL 应用程序并将其翻译为操作系统。但是我们如何设置它?

我们有两个选择:

  1. 我们在每个需要运行我们的应用程序的系统上安装 .NET 运行时;这样我们的应用就变得可移植了,但它需要运行时才能工作。

  2. 我们在应用程序中包含运行时代码;这样我们的应用就不需要运行时,但它不再是可移植的,因为它携带运行时它会更大。

现在来消除您的一些困惑:

.NET Framework 和 .NET Core 有什么区别?

.NET Framework 仅在 Windows 上运行,并且有更多的库可供使用。

.NET Core 是跨平台的,使用的库较少,但速度非常快。现在它的名称是 .NET 5,并且添加了那些额外的仅限 Windows 的库。

.NET SDK 和运行时有什么区别?

SDK 为您提供了构建应用所需的工具(SDK 还包括运行时)。

运行时间更轻,只运行您的应用程序。

.NET Core 运行时和 ASP.NET Core 运行时有什么区别?

.NET Core 运行时(现在是 .NET 5 运行时)只能运行您的控制台应用程序并且更轻。

ASP.NET Core 运行时可以运行您的 Web 应用程序。

还有用于运行 WinForms 和 WPF 应用程序(仅限 Windows)的 GUI 应用程序的运行时。

什么是MVC?

模型-视图-控制器是一种设计模式,与特定的语言或框架无关。

相关问题