Справочная информация. Проект, над которым мы работаем, состоит из нескольких решений, которые совместно используют две библиотеки . Сегодня все написано в .NET Framework 4.6.1
. Целью проекта было принятие .NET Core
для новых проектов и возможность запуска веб-приложений в Docker
.
С новым выпуском .NET Standard 2.1
и тем фактом, что .NET Framework 4.8
останется на .NET Standard 2.0
вместо реализации .NET Standard 2.1
, пришло время начать. Иммо Ландверт из Microsoft говорит так:
Но также верно то, что уровень инноваций в .NET Framework
должен замедлить, чтобы уменьшить поломку. В этом смысле вы
следует ожидать, что большинство новых функций
доступны на .NET Core (и производных платформах, таких как Xamarin, Mono,
и Unity, созданный из тех же источников, что и .NET Core).
https://blogs.msdn.microsoft.com/dotnet/2018/11/05/announcing-net-standard-2-1/
Мы хотели бы получить доступ к новым функциям в наших новых проектах, но не хотим преобразовывать каждый старый проект в .NET Core
. Чтобы сохранить совместимость между .NET Framework
и .NET Core
, мы решили преобразовать наши общие библиотеки в .NET Standard 2.0
.
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
Это сработало очень хорошо, за исключением следующих зависимостей:
1. System.Net.Http.WebRequestHandler - решено
Используется для клиентских сертификатов, таких как:
WebRequestHandler requestHandler = new WebRequestHandler();
//Add certificate if setting exists
if (!string.IsNullOrEmpty(pushEvent?.CertificateThumbprint?.Thumbprint))
{
var certificate = certificateService.GetClientCertificate(pushEvent?.CertificateThumbprint?.Thumbprint);
if (certificate != null)
{
requestHandler.ClientCertificates.Add(certificate);
}
}
var client = new HttpClient(requestHandler);
Я нашел для него NuGet, но он кажется вредоносным. Пакет ссылается на документацию Microsoft как сайт проекта и содержит ошибку Microsoft как автора, Microsfot. Об этом сообщили, так что Microsoft может взглянуть на это.
https://www.nuget.org/packages/WebRequest.WebRequestHandler/
Однако, похоже, мы можем изменить WebRequestHandler
на HttpClientHandler
, чтобы получить его из коробки.
2. System.Runtime.Remoting.Messaging -> CallContext.LogicalGetData - решено
Решено здесь: https://stackoverflow.com/a/53211839/3850405
3. Microsoft.AspNet.Identity.EntityFramework.IdentityUser
У нас есть модель пользователя, которая наследуется от IdentityUser
.
public class AppUser : IdentityUser, ICurrentUser
{
public bool LocalEnvironment { get; set; }
public Guid? TokenId { get; set; }
}
4. Microsoft.AspNet.Identity.UserManager из сборки Microsoft.AspNet.Identity.Core
Мы сохраняем наш UserManager
общий для проектов. Container
от SimpleInjector
, который совместим с .NET Standard 2.0
.
public class AppUserManager : UserManager<AppUser>
{
public AppUserManager(IUserStore<AppUser> store)
: base(store)
{
}
public static AppUserManager Create<AppContainer>() where AppContainer : Container, new()
{
var container = new AppContainer();
var store = container.GetInstance<IUserStore<AppUser>>();
var manager = new AppUserManager(store);
manager.UserValidator = new UserValidator<AppUser>(manager)
{
AllowOnlyAlphanumericUserNames = false
};
return manager;
}
}
Если в общей библиотеке установлена EntityFramework NuGet
, появится предупреждение ниже. Мы не можем рисковать этим.
Пакет EntityFramework 6.2.0 восстановлен с использованием
'.NETFramework, Version = v4.6.1' вместо целевой структуры проекта
».NETStandard, Version = v2.0. Этот пакет может быть не полностью совместимым
с вашим проектом.
Я читал о том, почему они помещают IdentityUser
в библиотеку EF, IdentityUser
очень специфично для EF. Однако это затрудняет перенос на .NET Standard 2.0.
.
Почему класс IdentityUser находится в пространстве имен Microsoft.AspNet.Identity.EntityFramework, а не в пакете Core?
Я также прочитал, что ASP.NET Core 2.0
удалил основание IdentityUser
POCO (Простой старый объект CLR).
Microsoft.AspNetCore.Identity
и Microsoft.AspNetCore.Identity.EntityFrameworkCore
зависят только от .NETStandard 2.0
и могут быть установлены без предупреждения. Нужно ли обновлять Entity Framework и Identity на ASP.NET до Core или есть другой способ заставить его работать с .NET Standard
? Последний шаг, который нам нужен, чтобы запустить его.
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-2.1
https://docs.microsoft.com/en-us/ef/efcore-and-ef6/side-by-side