簡體   English   中英

ASP.NET 核心 - 值不能是 null。 當前用戶配置文件中的(參數“s”)

[英]ASP.NET Core - Value cannot be null. (Parameter 's') in Current User Profile

在ASP.NET Core Web API中,我有三個項目:

API.Infrastructure(for DB) -> API.Core(for DTO, Services) -> API.Web

我正在使用 IdentityDbContext。 我有一個名為 Profile 的用戶配置文件的 model。

Model:

namespace API.Infrastructure.Entities.Models
{
    public class Employee
    {
        public long Id { get; set; }
        public string StaffNumber { get; set; }
        public long? UserId { get; set; }
        public DateTime EmploymentDate { get; set; }
        public virtual ApplicationUser User { get; set; }
    }
}

映射器:

public class EmployeeMapperProfile : Profile
{
    public EmployeeMapperProfile()
    {
        CreateMap<Employee, EmployeeProfileDto>();
    }
}

DTO:

namespace Core.DTOs.Empployee.Response
{
    public class EmployeeListDto
    {
        public string StaffNumber { get; set; }
        public DateTime? EmploymentDate { get; set; }
    }
}

public class GenericResponseDto<T>
{
    public int? StatusCode { get; set; }
    public T Result { get; set; }
    public ErrorResponseDto Error { get; set; }
}

我為此創建了一個服務:

namespace API.Core.Helpers
{
    public class UserResolverService
    {
        private readonly IHttpContextAccessor _httpContext;
        private readonly UserManager<ApplicationUser> _userManager;

        public UserResolverService(IHttpContextAccessor httpContext, UserManager<ApplicationUser> userManager)
        {
            _httpContext = httpContext;
            _userManager = userManager;
        }
        public string GetUserId()
        {
            var userId = _userManager.GetUserId(_httpContext.HttpContext.User);
            return userId;
        }
    }
}

然后我有員工資料服務:

Task<GenericResponseDto<EmployeeProfileDto>> GetEmployeeProfileAsync();

public class EmployeeService : I EmployeeService
{
    private readonly HrDbContext _context;
    private readonly IMapper _mapper;
    private readonly UserResolverService _userResolverService;

    public EmployeeService(HrDbContext context, IMapper mapper, UserResolverService userResolverService)
    {
        _mapper = mapper;
        _userResolverService = userResolverService;
    }

    public async Task<GenericResponseDto<EmployeeProfileDto>> GetEmployeeProfileAsync()
    {
        var response = new GenericResponseDto<EmployeeProfileDto>();
        var userId = long.Parse(_userResolverService.GetUserId());
        var employeeId = _context.employees.Where(u => u.UserId == userId).Select(m => m.Id).FirstOrDefault();

        var employeeProfile = await _context.employees.Include(e => e.User)
                                            .FirstOrDefaultAsync(e => e.Id == employeeId);

        if (employeeProfile != null)
        {
            response.Result = _mapper.Map<EmployeeProfileDto>(employeeProfile);
            response.StatusCode = 200;
        }
        else
        {
            response.Error = new ErrorResponseDto()
            {
                ErrorCode = 404,
                Message = "Employee not found!"
            };
            response.StatusCode = 404;

        }
        return response;
    }
}

Controller:

    public async Task<ActionResult<GenericResponseDto<EmployeeProfileDto>>> GetEmployeeProfile()
    {
        var response = await _employeeService.GetEmployeeProfileAsync();
        Response.StatusCode = response.StatusCode ?? StatusCodes.Status200OK;
        return new JsonResult(response);
    }

啟動.cs:

 services.AddScoped<IEmployeeService, EmployeeService>();
 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 services.AddAutoMapper(typeof(EmployeeMapperProfile));

我想使用 id 獲取當前登錄用戶的個人資料。

當我在 POSTMAN 上進行測試時,我沒有得到當前登錄用戶的配置文件,而是得到了這個錯誤消息:

值不能是 null。 (參數')

當我嘗試調試代碼時:

var userId = long.Parse(_userResolverService.GetUserId());

給出 null。

為什么我會收到此錯誤?

然后當前用戶存在,因為我能夠登錄並生成 Bearer JWT 令牌

要查找已登錄用戶的 ID,您可以使用此條件 _httpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value

聲明類型可以根據您在創建 jwt 令牌時生成的名稱進行更改,以確保您可以獲取您的令牌並在 jwt.io 網站查看它的值時查看 keyType 的 keyIdentifier 並為我生成用戶ID jwt 我將它命名為 userId 所以在 httpcontext 中調用它時我用這個 creteria _httpContext.User.FindFirst("userId").Value 我希望這對你有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM