Обновление библиотеки .NET Standard для работы с ASP.NET Core 2.2 и 3.0 - PullRequest
1 голос
/ 01 ноября 2019

У меня есть библиотека .NET Standard, которая используется несколькими веб-приложениями в нашей организации. Поскольку все они используют одну и ту же схему для аутентификации, код был помещен в разделяемую библиотеку. Все веб-приложения нацелены на netcoreapp2.2, а библиотека нацелена на netstandard2.0. Я обновил первое веб-приложение до netcoreapp3.0, и после этого оно не запустилось при запуске с этой ошибкой:

System.MissingFieldException: поле не найдено: 'Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme '.

Который был сгенерирован из этой строки в методе расширения библиотеки:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Для этого .csproj файлбиблиотека изначально выглядела до обновления:

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

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
    <RootNamespace></RootNamespace>
    <AssemblyName></AssemblyName>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.Graph" Version="1.17.0" />
    <PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
  </ItemGroup>

</Project>

И это работало для наших приложений ASP.NET Core 2.2. После некоторых изменений я запустил приложение ASP.NET Core 3.0 после изменения библиотеки на следующую:

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

  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
    <RootNamespace></RootNamespace>
    <AssemblyName></AssemblyName>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.0.0" />
    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0" />
    <PackageReference Include="Microsoft.Graph" Version="1.17.0" />
    <PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
    <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.Graph" Version="1.17.0" />
    <PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
  </ItemGroup>

</Project>

Это предпочтительный / правильный способ сделать это, или есть что-то более простое? Должна ли библиотека использовать Microsoft.NET.Sdk.Web SDK вместо?

1 Ответ

0 голосов
/ 01 ноября 2019
  1. Если проект или любая из его зависимостей имеет значение <Project Sdk="Microsoft.NET.Sdk"> или <Project Sdk="Microsoft.NET.Razor">, тогда явно добавьте <FrameworkReference Include="Microsoft.AspNetCore.App" />.
  2. Если проект <Project Sdk="Microsoft.NET.Sdk.Web">, вам не нужно добавлять <FrameworkReference Include="Microsoft.AspNetCore.App" />, его добавление обязательно.
  3. Если у вас есть функции лазури, дождитесь этого исправления: https://github.com/Azure/azure-functions-vs-build-sdk/issues/339

Подробнее: ASP.NET Core 2.2 до 3.0

Миграция с ASP.NET Core 2.2 до 3.0

Срочные изменениявключены в EF Core 3.0 Что нового в ASP.NET Core 3.0

Разрыв изменений при переходе с версии 2.2 на 3.0

Обновления ASP.NET Core в .NET Core 3.0 Preview 4

Разработка функций Azure с использованием .NET Core 3.0

Перемещение ASP.NETОсновные функции Azure в 4 этапа

Также обратите внимание, что при использовании нескольких TargetFrameworks необходимо добавить несколько реализаций:

var webRootFileProvider =
#if NETCOREAPP3_0
    GetRequiredService<IWebHostEnvironment>().WebRootFileProvider;
#elif NETSTANDARD2_0
    GetRequiredService<IHostingEnvironment>().WebRootFileProvider;
#else
#error unknown target framework
#endif
...