后台作业失败,“当前用户未登录到应用程序”

问题描述 投票:-1回答:1

使用Abp Background Job使用MVC jQuery .NET Core

我有一个后台作业正确排队,我可以看到数据库中的作业。

然而,日志记录显示我正在获取并且授权错误(如下所示)尽管已登录。我在服务和后台作业上具有相同的AbpAuthorize属性。

不知道如何继续调试问题 - 欢迎任何建议。

服务代码使用/完成工作:

   public async Task BulkImportBackground(IList<CreatePracticeDto> inputs)
        {
            await _backgroundJobManager.EnqueueAsync<ImportBulkPracticesBackgroundJob, ImportBulkPracticesBackgroundJobArgs>(
                new ImportBulkPracticesBackgroundJobArgs
                {
                    CreatePracticeDtos = inputs
                });

            _backgroundJobManager.Start();
        }

职业类别代码:

using Abp.Authorization;
using Abp.BackgroundJobs;
using Abp.Dependency;
using Abp.Modules;
using Gp.Authorization;
using Gp.Ccre.ImportResult;
using Gp.Ccre.ImportResult.Dtos;
using Gp.Ccre.Practice.Dtos;
using System;
using System.Collections.Generic;
using System.Linq;
using Abp.Domain.Uow;

namespace Gp.Ccre.Practice.BackgroundJobs
{
    [DependsOn(
        typeof(IPracticeAppService),
        typeof(IImportResultsAppService))]
    [AbpAuthorize(PermissionNames.Pages_Practices, RequireAllPermissions = false)]
    public class ImportBulkPracticesBackgroundJob : BackgroundJob<ImportBulkPracticesBackgroundJobArgs>, ITransientDependency
    {
        private readonly IPracticeAppService _practiceAppService;
        private readonly IImportResultsAppService _importResultsAppService;

        public ImportBulkPracticesBackgroundJob(IImportResultsAppService importResultsAppService, IPracticeAppService practiceAppService)
        {
            _practiceAppService = practiceAppService;
            _importResultsAppService = importResultsAppService;
        }


        public override void Execute(ImportBulkPracticesBackgroundJobArgs args)
        {

            IList<CreateImportResultDto> createResultsDto = new List<CreateImportResultDto>();
            var k = 0;

            DateTime importedOn = DateTime.Now;

            foreach (CreatePracticeDto createDto in args.CreatePracticeDtos)
            {
                k++;
                try
                {
                    //this correctly automatically ignores 'soft' deleted records.
                    var count = _practiceAppService.GetAllIdName().Result.Count(x => x.Name.Equals(createDto.Name, StringComparison.CurrentCultureIgnoreCase));
                    if (count > 0)
                    {
                        createResultsDto.Add(new CreateImportResultDto
                        {
                            Row = k,
                            Name = createDto.Name,
                            Message = "Already exists. Skipped.",
                            MessageType = AppConsts.ImportMessageType.Warning.ToString(),
                            ImportedOn = importedOn
                        });
                        continue;
                    }

                    // ** GOOGLE MAP API CALL **
                    var coordinatesFound = false; //_practiceAppService.TryGetGeoCodeAddress(createDto);

                    createDto.ImportedOn = importedOn;


                    // ***  SAVE SINGLE ****
                    _practiceAppService.Create(createDto);

                    createResultsDto.Add(new CreateImportResultDto
                    {
                        Row = k,
                        Name = createDto.Name,
                        Message = "Successful.",
                        MessageType = AppConsts.ImportMessageType.Info.ToString(),
                        ImportedOn = importedOn,
                        GoogleMapCoordinatesFound = coordinatesFound
                    });

                }
                catch (Exception e)
                {
                    createResultsDto.Add(new CreateImportResultDto
                    {
                        Row = k,
                        Name = createDto.Name,
                        Message = e.Message,
                        MessageType = AppConsts.ImportMessageType.Error.ToString(),
                        ImportedOn = importedOn
                    });
                    continue;
                }
            }

            //*** SAVE RESULTS ***
            foreach (var resultDto in createResultsDto)
            {
                _importResultsAppService.Create(resultDto);
            }

            CurrentUnitOfWork.SaveChanges();
        }
    }

    [Serializable]
    public class ImportBulkPracticesBackgroundJobArgs
    {
        public IList<CreatePracticeDto> CreatePracticeDtos { get; set; }

    }
}

堆栈跟踪(部分)

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Abp.Authorization.AbpAuthorizationException: Current user did not login to the application!
   at Abp.Authorization.AuthorizationHelper.AuthorizeAsync(IEnumerable`1 authorizeAttributes) in D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs:line 43
   at Abp.Authorization.AuthorizationHelper.CheckPermissions(MethodInfo methodInfo, Type type) in D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs:line 98
   at Abp.Authorization.AuthorizationHelper.AuthorizeAsync(MethodInfo methodInfo, Type type) in D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationHelper.cs:line 57
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
   at Nito.AsyncEx.Synchronous.TaskExtensions.WaitAndUnwrapException(Task task)
   at Nito.AsyncEx.AsyncContext.Run(Func`1 action)
   at Abp.Authorization.AuthorizationInterceptor.Intercept(IInvocation invocation) in D:\Github\aspnetboilerplate\src\Abp\Authorization\AuthorizationInterceptor.cs:line 20
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Abp.BackgroundJobs.BackgroundJobManager.TryProcessJob(BackgroundJobInfo jobInfo) in D:\Github\aspnetboilerplate\src\Abp\BackgroundJobs\BackgroundJobManager.cs:line 119
aspnetboilerplate
1个回答
2
投票

问题是由于尝试将服务注入后台作业而引起的。坚持使用IRepository,一切都很好。

© www.soinside.com 2019 - 2024. All rights reserved.