SignInManager <TUser>.PasswordSignInAsyn c () вызывает System.Text. Json исключение цикла объекта - PullRequest
0 голосов
/ 01 марта 2020

Несколько дней go Я решил переписать старый проект API с net core 2.0 на 3.1, но сегодня я столкнулся с ошибкой, которую не могу решить. После переписывания класса «AccountManager» класс _signInManager.PasswordSignInAsyn c () начинает выдавать ошибку, связанную с Json циклом объекта.

Исключение:

((System.Text. Json .JsonException) ex). Сообщение: Обнаружен возможный цикл объекта, который не поддерживается. Это может быть связано с циклом или если глубина объекта превышает максимально допустимую глубину 32.

Пример использования:

public class AccountManager : IAccountManager{

        public ApplicationUser ActualUser { get; private set; }
        private readonly SignInManager<ApplicationUser> _signInManager;

        public AccountManager(SignInManager<ApplicationUser> signInManager)
        {
            _signInManager = signInManager;
        }

        public async Task<LoginResponseDTO> LoginAsync(LoginRequestDTO input)
        {
            var result = await _signInManager.PasswordSignInAsync(input.Email, input.Password, false, true);
            ...
        }
}

Запуск:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var builder = services.AddIdentityCore<ApplicationUser>(u =>
            {
                ...
            })
            .AddEntityFrameworkStores<RBDbContext>().AddDefaultTokenProviders()
            .AddSignInManager<UserManager<ApplicationUser>>()
            .AddUserManager<UserManager<ApplicationUser>>();
            builder.AddEntityFrameworkStores<RBDbContext>().AddDefaultTokenProviders();
            services.AddScoped<IAccountManager,AccountManager>();
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

Я даже пытался использовать атрибут пользователя и других классов [JsonIgnore], но это не сработало. Пользовательский класс приложения:

    public class ApplicationUser : IdentityUser
    {
        public string Avatar { get; set; }
        ...

        [JsonIgnore]
        public virtual ICollection<Order> Orders{ get; set; }
        [JsonIgnore]
        public virtual ICollection<Participation> Participations{ get; set; }
        [JsonIgnore]
        public virtual ICollection<UserProduct> UserProducts{ get; set; }
    }

UserManager поставляется из Microsoft.Extensions.Identity.Core, версия = 3.1.2.0

1 Ответ

0 голосов
/ 03 марта 2020

Обнаружен возможный цикл объекта, который не поддерживается. Это может быть связано с циклом или если глубина объекта превышает максимально допустимую глубину 32.

В ASP. NET Core 3.0+, используется System.Text.Json для по умолчанию для JSON сериализации , а некоторые функции Newtonsoft.Json могут не работать с System.Text. Json (например, Newtonsoft. Json не имеет максимального ограничения глубины по по умолчанию), что может вызвать эту проблему.

Вы можете попробовать установить Microsoft.AspNetCore. Mvc .Newtonsoft Json NuGet, чтобы добавить поддержку Newtonsoft. Json основанные форматеры и функции со следующим фрагментом кода, и проверьте, работает ли он для вас.

services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

Кроме того, вы можете найти различия между Newtonsoft. Json и System.Text. Json здесь: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#table -of-различия между ними-newtonsoft json и-systemtext json

...