1

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

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

我担心我错了。

当我运行我的自包含应用程序时,它会给出以下错误:

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

当我查找此内容时,我发现我需要安装托管捆绑包。当您访问拥有它的 .net 核心站点时,它显示为 .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 服务?

4

1 回答 1

2

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

服务1.csproj

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

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

服务2.csproj

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

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

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

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

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

看看这个实验。在我的机器上安装了以下内容:1)Asp.Net Core Runtime 2.1.14 2)Asp.Net Core Runtime 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}.
                ");
            });
        }
    }

我在版本中发布了这两个服务:Service1: C:\Users\info\source\repos\Service1> dotnet publish -c Release Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core 版权所有 (C) Microsoft Corporation。版权所有。

  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 核心框架并在同一 IIS 上运行特定版本的 Web 应用程序是没有问题的。

于 2020-02-24T13:22:57.593 回答