Activities of "maliming"

请尝试把这个文件中的端口也一并修改

etc\abp-studio\run-profiles\Default.abprun.json

执行 dotnet run 命令应用程序输出的日志是什么?

改成其他的端口呢? 比如 40000

hi

Can you try to upgrade to >=9.1.1

Or try to add MyAbpEfCoreNavigationHelper to your EF Core project.

using Microsoft.EntityFrameworkCore.ChangeTracking;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EntityFrameworkCore.ChangeTrackers;
using Volo.Abp.OpenIddict.Tokens;

namespace Pusula.Training.HealthCare.EntityFrameworkCore;

[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(AbpEfCoreNavigationHelper))]
public class MyAbpEfCoreNavigationHelper : AbpEfCoreNavigationHelper
{
    public override void ChangeTracker_Tracked(object? sender, EntityTrackedEventArgs e)
    {
        if (e.Entry.Entity.GetType() == typeof(OpenIddictToken))
        {
            return;
        }

        base.ChangeTracker_Tracked(sender, e);
    }

    public override void ChangeTracker_StateChanged(object? sender, EntityStateChangedEventArgs e)
    {
        if (e.Entry.Entity.GetType() == typeof(OpenIddictToken))
        {
            return;
        }

        base.ChangeTracker_StateChanged(sender, e);
    }
}

hi

I think your email settings can be read correctly, but the value is wrong.

You can check it by override the MailKitSmtpEmailSender

[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IMailKitSmtpEmailSender), typeof(MailKitSmtpEmailSender), typeof(MyMailKitSmtpEmailSender))]
public class MyMailKitSmtpEmailSender : MailKitSmtpEmailSender, IMailKitSmtpEmailSender, ITransientDependency
{
    public MyMailKitSmtpEmailSender(
        ICurrentTenant currentTenant,
        ISmtpEmailSenderConfiguration smtpConfiguration,
        IBackgroundJobManager backgroundJobManager,
        IOptions<AbpMailKitOptions> abpMailKitConfiguration)
        : base(currentTenant, smtpConfiguration, backgroundJobManager, abpMailKitConfiguration)
    {
    }

    protected override Task ConfigureClient(SmtpClient client)
    {
        var host = SmtpConfiguration.GetHostAsync();
        var port = SmtpConfiguration.GetPortAsync();
        var userName = SmtpConfiguration.GetUserNameAsync();
        var password = SmtpConfiguration.GetPasswordAsync();
        var domain = SmtpConfiguration.GetDomainAsync();
        var enableSsl = SmtpConfiguration.GetEnableSslAsync();
        var useDefaultCredentials = SmtpConfiguration.GetUseDefaultCredentialsAsync();

        return base.ConfigureClient(client);
    }
}

https://support.sendgrid.com/hc/en-us/articles/17894803361819-Troubleshooting-535-Authentication-failed-Error

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);
}

Showing 3431 to 3440 of 12930 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on November 02, 2026, 06:56
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.