【问题标题】:Can an ASP.NET Core v3.1 app really be self contained?ASP.NET Core v3.1 应用程序真的可以自包含吗?
【发布时间】:2020-02-21 23:27:23
【问题描述】:

我有一台服务器,目前在 IIS 中托管许多 .net core v2 服务。

我有一个新的服务。通常我会使用服务器安装的任何运行时,但我想,“.Net Core 可以部署自包含的应用程序,所以我可以同时使用 v2 服务和 v3 服务。

我担心我错了。

当我运行我的独立应用程序时,它给出了以下错误:

处理程序“aspNetCore”的模块列表中有一个错误模块“AspNetCoreModuleV2”。

当我查看 I find 时,我需要安装托管包。当您转到 .net core site that has it 时,它显示为 .Net Core(在 IIS 机器上)的推荐 安装 方法。

这就是我开始担心的地方。我以为我不必在我的服务器上安装 .net core 3。我以为我可以运行一个独立的应用程序。

如果不测试所有以 .Net Core v2 为目标的现有服务在 .Net Core v3 运行时上是否正常工作,我无法安装 .Net Core v3。

所以,看来我将不得不将我的服务降级到 v2(糟糕,我讨厌向后工作。)

但在我这样做之前,我想我会问:
有没有办法在 IIS 上托管一个只有 .Net Core v2 运行时的 Asp.Net Core v3 Web API 服务?

【问题讨论】:

  • 自包含部署适用于除 IIS 之外的任何地方。因此,在您的情况下,您别无选择,只能在 IIS 上安装必要版本的 ASP.NET Core 模块(不需要 .NET Core 运行时,因为您的自包含二进制文件已经具有运行时)。顺便说一句,NET Core 2.1 的 ASP.NET Core 模块不适用于 ASP.NET Core 3.1 Web 应用程序,这就是您收到模块错误的原因。
  • 你会考虑 IIS 作为反向代理/URL 重写前端吗?
  • 这就是容器化来拯救的地方

标签: asp.net-core iis .net-core asp.net-core-3.1 self-contained


【解决方案1】:

使用哪个运行时版本由您的项目文件定义,因此不同的运行时可以在同一台机器上运行而不会出现任何问题。 假设您有两个服务:Service1 是使用 .net core 2.1 构建的,Service2 是使用 .net core 3.1 构建的。 项目文件将如下所示:

Service1.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

Service2.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

一旦您通过dotnet rundotnet ServiceX.dll 运行应用程序,dotnet 可执行文件就是应用程序的主机,并根据程序集元数据选择正确的运行时。要使用的运行时实际上是编写在已编译的 DLL 中。

因此,只要安装了所需的运行时,2.* 和 3.* 应用程序可以完全共存于同一台机器上。

在此处阅读更多信息:https://docs.microsoft.com/en-us/dotnet/core/versions/selection

看看这个实验。 在我的机器上安装了以下内容: 1) Asp.Net Core 运行时 2.1.14 2) Asp.Net Core 运行时 3.1.2 3) IIS 10.0 4) Asp.Net Core Module(随托管包一起安装)

我创建了 2 个应用程序,每个运行时一个:

dotnet new web -f netcoreapp2.1 -o Service1

dotnet new web -f netcoreapp3.1 -o Service2

然后我像这样修改了两个应用程序 Startup.cs:

    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                var framework = Assembly
                    .GetEntryAssembly()?
                    .GetCustomAttribute<TargetFrameworkAttribute>()?
                    .FrameworkName;
                var taskLocation = typeof(Task).Assembly.Location;
                await context.Response.WriteAsync($@"Hello World from {framework}
Location of Task assembly: {taskLocation}.
                ");
            });
        }
    }

我在 release 中发布了这两个服务: 服务1: C:\Users\info\source\repos\Service1> dotnet publish -c Release 适用于 .NET Core 的 Microsoft (R) Build Engine 版本 16.4.0+e901037fe 版权所有 (C) 微软公司。保留所有权利。

  Restore completed in 159,32 ms for C:\Users\info\source\repos\Service1\Service1.csproj.
  Service1 -> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\Service1.dll
  Service1 -> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\publish\

服务2:

C:\Users\info\source\repos\Service2> dotnet publish -c Release
Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 41,98 ms for C:\Users\info\source\repos\Service2\Service2.csproj.
  Service2 -> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\Service2.dll
  Service2 -> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\publish\

在 IIS 下我创建了两个网站,每个服务一个,每个都指向正确的输出目录

service1.lvh.me >>> C:\Users\info\source\repos\Service1\bin\Release\netcoreapp2.1\publish\

service2.lvh.me >>> C:\Users\info\source\repos\Service2\bin\Release\netcoreapp3.1\publish\

然后我访问了每个网站。访问 service1.lvh.me 我得到: 并访问 service2.lvh.me 我得到了:

如您所见,每个应用程序都需要正确版本的框架,并且框架类型是从特定文件夹加载的。

因此,在同一台机器上运行不同版本的 .net core framework 并在同一 IIS 上运行特定版本的 Web 应用程序是没有问题的。

【讨论】:

  • 您知道任何适用于 IIS 的文档吗? (我没有使用dotnet run)。我希望看到有关“IIS 并行支持”的文档。 (我不信任并列的一般文档信息,因为它还谈到了“自包含”应用程序,对 IIS 没有任何警告,而且它不适用于 IIS。)
  • 您没有使用“dotnet run”,但您可能正在通过 AspNetCoreModule 运行,它通过启动“dotnet MyApp.dll”来启动您的应用程序。运行时选择完全相同,如docs.microsoft.com/en-us/dotnet/core/versions/… 中所述:“当您使用 dotnet run 从源代码运行应用程序时,使用 dotnet myapp.dll 从依赖于框架的部署运行应用程序,或使用 myapp.exe 从依赖于框架的可执行文件运行应用程序时, dotnet 可执行文件是应用程序的主机。”我在答案中添加了一个示例,希望对您有所帮助。
  • 这看起来很有希望。 .Net Core 3 显然需要 AspNetCoreModuleV2 才能在 IIS 中运行。没事儿。我担心它还会更改 .Net Core 2 IIS 在安装时使用的一些文件。在您的示例中,有没有办法查看服务 1 和服务 2 正在使用哪些 IIS 文件?
  • 我不知道 .net 核心可以使用任何 IIS 组件,除非您的应用程序是某种 IIS 管理应用程序(在这种情况下,它会通过某种服务,而不是直接篡改)。 IIS 将您的 .net 核心应用程序加载到一个包含空间(应用程序池)中,并将其与其他应用程序隔离开来。想想所有为网站提供共享空间的公司:如果框架版本控制对旧应用程序来说是一个问题,他们就无法做到这一点。
  • 恕我直言,您白担心了,但是如果您仍然不相信,请尝试使用与服务器相同的配置安装虚拟机,安装旧应用程序,新应用程序,并检查一切是否正常好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多