C# CreateAsync方法既不会抛出错误,也不会更新数据库
我有以下简单的代码来使用CreateAsync方法创建一个新用户。代码不会抛出任何错误,但也不会更新数据库。我在IdentityResult结果行中添加了一个断点,它在那里停止,在if语句中添加了另一个断点,它在那里不停止。因此,我不知道如何调试此代码并找到错误。有什么帮助吗 公共异步任务CreateApplicationUser用户,字符串密码 { IdentityResult result=wait_userManager.CreateAsyncuser,密码; 如果!result.successed { 抛出新AppException失败; } 返回结果; } 从控制器调用此创建函数: [异名] [HttpPost] [Routeapi/ApplicationUser/Register] 公共IActionResult寄存器[FromBody]应用程序插入到用户 { //将数据映射到实体 var user=\u mapper.MapuserDto; 尝试 { //拯救 _userService.Createuser,userDto.Password; 返回Ok; } 捕获异常 { //如果出现异常,则返回错误消息 返回BadRequestnew{message=ex.message}; } }C# CreateAsync方法既不会抛出错误,也不会更新数据库,c#,asp.net,asp.net-core,async-await,asp.net-identity,C#,Asp.net,Asp.net Core,Async Await,Asp.net Identity,我有以下简单的代码来使用CreateAsync方法创建一个新用户。代码不会抛出任何错误,但也不会更新数据库。我在IdentityResult结果行中添加了一个断点,它在那里停止,在if语句中添加了另一个断点,它在那里不停止。因此,我不知道如何调试此代码并找到错误。有什么帮助吗 公共异步任务CreateApplicationUser用户,字符串密码 { IdentityResult result=wait_userManager.CreateAsyncuser,密码; 如果!result.succ
Register方法是从React接口调用的。您从未等待过异步调用。因此,当您的操作结果返回时,它甚至可能无法完成,因此可能永远无法运行。确保等待任何异步调用。这意味着调用方法需要标记为async,并使其返回一个或多个任务,直到到达事件处理程序或框架代码为止。以下是您的代码的外观:
[AllowAnonymous]
[HttpPost]
[Route("api/ApplicationUser/Register")]
public async Task<IActionResult> Register([FromBody]ApplicationUserDto userDto)
{
//map dto to entity
var user = _mapper.Map<ApplicationUser>(userDto);
try
{
// save
await _userService.Create(user, userDto.Password);
return Ok();
}
catch (AppException ex)
{
// return error message if there was an exception
return BadRequest(new { message = ex.Message });
}
}
还要注意,将异常详细信息返回给客户机用户是个坏主意。异常可能包含敏感信息,攻击者可利用这些信息攻击您的系统。相反,只需返回一条通用的“对不起,出了问题”消息,并将异常详细信息记录到日志框架中。如果您没有日志框架,那么就买一个。您从未等待过异步调用。因此,当您的操作结果返回时,它甚至可能无法完成,因此可能永远无法运行。确保等待任何异步调用。这意味着调用方法需要标记为async,并使其返回一个或多个任务,直到到达事件处理程序或框架代码为止。以下是您的代码的外观:
[AllowAnonymous]
[HttpPost]
[Route("api/ApplicationUser/Register")]
public async Task<IActionResult> Register([FromBody]ApplicationUserDto userDto)
{
//map dto to entity
var user = _mapper.Map<ApplicationUser>(userDto);
try
{
// save
await _userService.Create(user, userDto.Password);
return Ok();
}
catch (AppException ex)
{
// return error message if there was an exception
return BadRequest(new { message = ex.Message });
}
}
还要注意,将异常详细信息返回给客户机用户是个坏主意。异常可能包含敏感信息,攻击者可利用这些信息攻击您的系统。相反,只需返回一条通用的“对不起,出了问题”消息,并将异常详细信息记录到日志框架中。如果您没有日志框架,请获取一个。您是否验证了它正在更新正确的数据库?你分析代码了吗?结果的其他属性是否有帮助?您是否在附加调试程序的情况下逐行检查代码,以确保它被命中?有一段代码在调用你的Create方法?@mason,它在IdentityResult结果行中停止。但是,尽管有一个断点,但以后不会停止。此外,“单步调试”选项未访问CreateAync的内部。您可能遇到了死锁,如何调用它?@nalnpir我在OP中共享了它。您是否尝试将ConfigureWaitFalse添加到CreateAync中?老实说,我不确定这是否会起作用,因为您的公共方法是同步的,我认为它会在执行任何操作之前返回,这就是为什么您的代码根本没有执行的原因。您是否验证了它正在更新正确的数据库?你分析代码了吗?结果的其他属性是否有帮助?您是否在附加调试程序的情况下逐行检查代码,以确保它被命中?有一段代码在调用你的Create方法?@mason,它在IdentityResult结果行中停止。但是,尽管有一个断点,但以后不会停止。此外,“单步调试”选项未访问CreateAync的内部。您可能遇到了死锁,如何调用它?@nalnpir我在OP中共享了它。您是否尝试将ConfigureWaitFalse添加到CreateAync中?老实说,我不确定这是否会起作用,因为您的公共方法是同步的,我认为它会在执行任何操作之前返回,这就是您的代码根本不执行的原因