Невозможно получить доступ к удаленному объекту. \ R \ nИмя объекта: 'UserManager`1 - при вызове CreateAsyn c (пользователь, model.password) - PullRequest
0 голосов
/ 05 августа 2020

Я работаю. net Основной проект. В структуре моего проекта 4 проекта.

  1. Student_Database - (Содержит табличную модель базы данных и ApplicatinDBContext)
  2. Student_Entities - (Содержит все модели со стороны представления)
  3. Student_Service - (Отсюда вся обработка операций с базой данных. Она связана с базой данных. Пример: IUserService и UserService)
  4. Student_Web - (Контроллеры и все методы, logi c вместе со всеми представлениями находятся в этом проекте)

Я реализовал ядро ​​Entity Framework. И попробуйте использовать Usermanager для вставки данных. Теперь, когда я вызываю метод CreateAsyn c из контроллера (Student_Web), он работает нормально, и пользователь вставлен. Но я хочу реализовать работу с базой данных в Student_Service. Поэтому, когда я вызываю CreateAsyn c из UserService, я получаю ошибку «Невозможно получить доступ к удаленному объекту. \ R \ nObject name: 'UserManager`1»

Я вызываю этот интерфейс IUserService из контроллера. Вот мой код в UserService.

Пожалуйста, помогите мне решить эту проблему.

public class UserService : IUserService
{
    #region Properties

    private readonly IDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<IdentityRole<int>> _roleManager;

    #endregion

    #region Consturctor

    public UserService(
        IDbContext context
        , UserManager<ApplicationUser> userManager
        , RoleManager<IdentityRole<int>> roleManager
    {
        _context = context;
        _userManager = userManager;
        _roleManager = roleManager;
    }
    #endregion

    #region Methods
        
    public async Task<bool> Create(NewUsers model)
    {
        bool result = false;
        try
        {
            var user = await _userManager.FindByNameAsync(model.UserName);
            if (user == null)
            {
                model.Password = GeneratePassword();
                user = new ApplicationUser
                {
                    //Id = 10,
                    UserName = model.UserName,
                    Email = model.UserName,
                    AccessFailedCount = 0,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    CreatedBy = 2,
                    CreatedDate = DateTime.UtcNow,
                    Active = false
                };
                    
                var returnResult = await _userManager.CreateAsync(user, model.Password);
                if (returnResult.Succeeded)
                {
                    returnResult = await _userManager.AddToRoleAsync(user, _roleManager.Roles.Where(x=>x.Id == model.RoleId).Select(x => x.Name).FirstOrDefault());
                }
                if (model.CompanyId!= null)
                {
                    foreach (var item in model.CompanyId)
                    {
                        var userMap = new UserCompanyMapping();
                        userMap.UserId = user.Id;
                        userMap.CompanyId = item;
                        _userCompanyMappingRepository.Insert(userMap);
                    }
                }
                result = returnResult.Succeeded;
            }
        }
        catch (Exception ex)
        {
            return false;
        }
        return result;
    }
    #endregion
}

//startup class

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

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(option =>
        {
            var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
            option.Filters.Add(new AuthorizeFilter(policy));
        });
        
        services.AddDbContextPool<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentityCore<ApplicationUser>();
        // Register Dependencies extra service
        services.AddAppServices();
            
        services.AddIdentity<ApplicationUser, IdentityRole<int>>(options =>
        {
            options.User.RequireUniqueEmail = true;
            options.Password.RequireNonAlphanumeric = false;
        })
       .AddRoles<IdentityRole<int>>()
       .AddEntityFrameworkStores<ApplicationDbContext>()
       .AddDefaultTokenProviders();

        services.ConfigureApplicationCookie(option =>
        {
            option.LoginPath = "/login";
            option.AccessDeniedPath = "/Login/AccessDenied";
        });

        // Register dependancy
        RegisterAutoMapper(services);
        RegisterServices(services);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.ConfigureRequestPipeline();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            //register all routes
            EngineContext.Current.Resolve<IRoutePublisher>().RegisterRoutes(endpoints);
        });
        //app.UseEndpoints(endpoints =>
        //{
        //    endpoints.MapControllerRoute(
        //        name: "default",
        //        pattern: "{controller=Login}/{action=Index}/{id?}");
        //});
    }

    private void RegisterServices(IServiceCollection services)
    {
        // Get class libraryGetAssembly(ty)
        var serviceLibraries = Assembly.Load("Student.Services")
            .GetTypes()
            .Where(x => x.IsClass && x.GetInterfaces().Any() && x.Namespace.Contains(".Services.Services"))
            .ToList();

        if (serviceLibraries != null && serviceLibraries.Count > 0)
        {
            foreach (var service in serviceLibraries)
            {
                var interfaceType = service.GetInterfaces().FirstOrDefault();
                services.AddScoped(interfaceType, service);
            }
        }
    }

    private void RegisterAutoMapper(IServiceCollection services)
    {
        // Auto Mapper Configurations
        var mappingConfig = new MapperConfiguration(mc =>
        {
            mc.AddProfile(new MappingProfile());
        });

        IMapper mapper = mappingConfig.CreateMapper();
        services.AddSingleton(mapper);
    }
}

//Action controller method



namespace Student.Web.Controllers
{
    [Authorize]
    public class UserController : Controller
    {
        private readonly IUserService userService;
        private readonly ICommonService commonService;

        public UserController(
            IUserService userService,
            ICommonService commonService)
        {
            this.userService = userService;
            this.commonService = commonService;
        }

        public IActionResult Index()
        {
            return View();
        }
        
        [HttpGet]
        public IActionResult Create()
        {
            ViewBag.RoleList = commonService.GetRoles().Result;
            ViewBag.CompanyList = commonService.GetCompanies().Result;
            ViewBag.CityList = commonService.GetCities().Result;
            ViewBag.CompanyAccessList = commonService.GetCompanyAccessListMultiCheck().Result;
            return View();
        }

        [HttpPost]
        public IActionResult Create(UserAddModel model)
        {
            if (ModelState.IsValid)
            {
                var response = userService.Create(model);
            }
            return RedirectToAction("Index");
        }
    }
}

1 Ответ

1 голос
/ 05 августа 2020

Вызов вашего service никогда не будет awaited, поэтому он вроде как стал fire-and-forget, что означает, что запрос может закончиться до того, как служба завершит свою работу, что приведет к удалению запрошенных служб.

Чтобы исправить это, вам нужно немного изменить свой Create Action, выполнив следующие действия:

  1. Сделайте свое действие async и позвольте ему вернуть Task<IActionResult>.
  2. Дождитесь обслуживания.
        [HttpPost]
        public async Task<IActionResult> Create(UserAddModel model)
        {
            if (ModelState.IsValid)
            {
                var response = await userService.Create(model);
            }
            return RedirectToAction("Index");
        }

Тогда все должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...