[英]ASP.NET Core 5 MVC: ArgumentNullException: Value cannot be null. (Parameter 'items')
[英]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.