Activities of "maliming"

hi

You can try to set command timeout to 60 seconds or more

public override void ConfigureServices(ServiceConfigurationContext context)
{
    //...

    Configure<AbpDbContextOptions>(options =>
    {
        options.UseSqlServer(x => x.CommandTimeout(60));
    });
    
    //...
}

hi

Is the AbpDbConcurrencyException fixed?

Please share the full debug logs.txt again for 409 error.

Thanks.

你可以试试安装 Volo.Abp.CLI然后使用 new 命令创建一个项目

abp new BookStore --version 8.3.4

https://www.nuget.org/packages/Volo.Abp.Cli/8.3.4

If your test project >= 9.1.1

Please share it with liming.ma@volosoft.com

Thanks.

hi

during this weekend i managed to isolate the problematic code and create a workaround.

What is your test project package version?

We did some changes in >= 9.1.1

https://github.com/abpframework/abp/pull/22357

hi

Can you try to override the ImportUsersFromFileAsync method of IdentityUserAppService to support batch import?

We will change it in the next version.

Thanks.

[Authorize(IdentityPermissions.Users.Import)]
public virtual async Task<ImportUsersFromFileOutput> ImportUsersFromFileAsync(ImportUsersFromFileInputWithStream input)
{
    await IdentityOptions.SetAsync();

    var stream = new MemoryStream();
    await input.File.GetStream().CopyToAsync(stream);

    var invalidUsers = new List<InvalidImportUsersFromFileDto>();
    List<InvalidImportUsersFromFileDto> waitingImportUsers;
    try
    {
        IConfiguration configuration = null;
        if (input.FileType == ImportUsersFromFileType.Csv)
        {
            configuration = new CsvConfiguration { Seperator = ';' };
        }

        waitingImportUsers = (await stream.QueryAsync<InvalidImportUsersFromFileDto>(excelType: input.FileType == ImportUsersFromFileType.Excel ? ExcelType.XLSX : ExcelType.CSV, configuration: configuration)).ToList();
    }
    catch (Exception)
    {
        throw new BusinessException(IdentityProErrorCodes.InvalidImportFileFormat);
    }

    if (!waitingImportUsers.Any())
    {
        throw new BusinessException(IdentityProErrorCodes.NoUserFoundInFile);
    }

    var resultDto = new ImportUsersFromFileOutput
    {
        AllCount = waitingImportUsers.Count
    };

    const int batchSize = 3;
    var totalUsers = waitingImportUsers.Count;
    var batchCount = (int)Math.Ceiling((double)totalUsers / batchSize);
    for (var batchIndex = 0; batchIndex < batchCount; batchIndex++)
    {
        var currentBatch = waitingImportUsers
            .Skip(batchIndex * batchSize)
            .Take(batchSize)
            .ToList();
        var (invalidBatchUsers, successBatchUsers) = await ImportUsersAsync(currentBatch);
        invalidUsers.AddRange(invalidBatchUsers);
        if (invalidBatchUsers.Any() && successBatchUsers.Any())
        {
            var (invalidBatchUsers2, successBatchUsers2) = await ImportUsersAsync(successBatchUsers);
            if (invalidBatchUsers2.Any())
            {
                invalidUsers.AddRange(invalidBatchUsers2);
                invalidUsers.AddRange(successBatchUsers2);
            }
        }
    }

    if (invalidUsers.Any())
    {
        var token = Guid.NewGuid().ToString("N");

        await ImportInvalidUsersCache.SetAsync(
            token,
            new ImportInvalidUsersCacheItem
            {
                Token = token,
                InvalidUsers = invalidUsers,
                FileType = input.FileType
            },
            new DistributedCacheEntryOptions
            {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1)
            });

        resultDto.InvalidUsersDownloadToken = token;
    }

    resultDto.SucceededCount = resultDto.AllCount - invalidUsers.Count;
    resultDto.FailedCount = invalidUsers.Count;

    return resultDto;
}

protected virtual async Task<(List<InvalidImportUsersFromFileDto>, List<InvalidImportUsersFromFileDto>)> ImportUsersAsync(List<InvalidImportUsersFromFileDto> users)
{
    var hasException = false;
    var invalidUsers = new List<InvalidImportUsersFromFileDto>();
    var successUsers = new List<InvalidImportUsersFromFileDto>();
    using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
    {
        foreach (var waitingImportUser in users)
        {
            try
            {
                var user = new IdentityUser(
                    GuidGenerator.Create(),
                    waitingImportUser.UserName,
                    waitingImportUser.EmailAddress,
                    CurrentTenant.Id
                )
                {
                    Surname = waitingImportUser.Surname,
                    Name = waitingImportUser.Name
                };

                if (!waitingImportUser.PhoneNumber.IsNullOrWhiteSpace())
                {
                    user.SetPhoneNumber(waitingImportUser.PhoneNumber, false);
                }

                if (!waitingImportUser.Password.IsNullOrWhiteSpace())
                {
                    (await UserManager.CreateAsync(user, waitingImportUser.Password)).CheckErrors();
                }
                else
                {
                    (await UserManager.CreateAsync(user)).CheckErrors();
                }

                if (!waitingImportUser.AssignedRoleNames.IsNullOrWhiteSpace())
                {
                    (await UserManager.SetRolesAsync(user,
                        waitingImportUser.AssignedRoleNames.Split(new[] { ",", ";" },
                            StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries))).CheckErrors();
                }

                if (!waitingImportUser.AssignedOrganizationUnitNames.IsNullOrWhiteSpace())
                {
                    var ouNames = waitingImportUser.AssignedOrganizationUnitNames.Split(new[] { ",", ";" },
                            StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToArray();
                    var ous = await OrganizationUnitRepository.GetListByDisplayNamesAsync(ouNames);
                    if (ous.Any())
                    {
                        await UserManager.SetOrganizationUnitsAsync(user, ous.Select(x => x.Id).ToArray());
                    }
                }

                successUsers.Add(waitingImportUser);
            }
            catch (Exception e)
            {
                hasException = true;

                waitingImportUser.ErrorReason = e is UserFriendlyException ? e.Message : e.ToString();
                invalidUsers.Add(waitingImportUser);
                Logger.LogWarning(e, $"Import user failed: {waitingImportUser}");
            }
        }

        await (hasException ? uow.RollbackAsync() : uow.CompleteAsync());
    }

    return (invalidUsers, successUsers);
}

hi

I will share a solution, Wait a sec.

Thanks.

hi

Can you share the authserver project logs?

https://abp.io/support/questions/8622/How-to-enable-Debug-logs-for-troubleshoot-problems

and the HTTP request and response of Angular.

https://abp.io/support/questions/8622/How-to-enable-Debug-logs-for-troubleshoot-problems#answer-3a1a1c4b-691e-3403-98b9-5f23fa024759

liming.ma@volosoft.com

Thanks

How to record the HTTP request and response of Chrome

hi

How many policies of abpPolicyNames and otherPolicyNames?

Thanks.

Showing 2071 to 2080 of 11567 entries
Learn More, Pay Less
33% OFF
All Trainings!
Get Your Deal
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.1.0-preview. Updated on December 25, 2025, 06:16
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.