C# 调试模式运行,发布失败
我正在尝试将我的asp.net应用程序投入生产。但是,当我在生产环境中运行应用程序时,某个路径并不能很好地工作。它说post.Author==null。当我在debug中运行应用程序时,它运行良好,即使没有断点 我在一个发布版本中尝试了这个应用程序,或者只是在rider中使用了start按钮,但两者都不起作用 这就是我试图调试的路线。我也有其他路线的问题C# 调试模式运行,发布失败,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在尝试将我的asp.net应用程序投入生产。但是,当我在生产环境中运行应用程序时,某个路径并不能很好地工作。它说post.Author==null。当我在debug中运行应用程序时,它运行良好,即使没有断点 我在一个发布版本中尝试了这个应用程序,或者只是在rider中使用了start按钮,但两者都不起作用 这就是我试图调试的路线。我也有其他路线的问题 [HttpGet("public/{orgId}")] public async Task<ActionResult<List&l
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
posts.ForEach(async post =>
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
});
return Ok(from post in posts where post.Published select post);
}
[HttpGet(“public/{orgId}”)]
公共异步任务GetAllPublicPostsByOrgId(字符串orgId)
{
List posts=await_postRepository.GetAllPostsByOrgId(orgId);
ForEach(异步post=>
{
UserModel author=await\u userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor=new UserModel();
saveAuthor.FirstName=author.FirstName;
saveAuthor.LastName=author.LastName;
post.Author=saveAuthor;
});
返回Ok(从发布的post中的post选择post);
}
作者应该为null,它应该是具有属性的对象
编辑:我试图在那个路由器上使用
[MethodImpl(methodimpoptions.NoOptimization)]
。这也不起作用。问题在于,您在ForEach
中使用的lambda基本上是一种异步void
方法,这意味着它是一种“火而忘”的方法。因此,您的代码将在设置完所有作者
属性之前到达返回
。相反,您应该使用普通的foreach(var post in posts)
,这样该方法将等待设置所有Author
属性。请注意,这可能只会在发行版中失败,因为这是一个竞争条件,调试可能会减慢速度,使其不会发生
或者,您可以将代码生成一个方法,并并行执行,然后等待所有任务完成后再返回
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks = new List<Task>();
foreach(var post in posts)
{
authorSetTasks.Add(SetAuthor(post));
}
await Task.WhenAll(authorSetTasks);
return Ok(from post in posts where post.Published select post);
}
private async Task SetAuthor(PostModel post)
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
}
[HttpGet(“public/{orgId}”)]
公共异步任务GetAllPublicPostsByOrgId(字符串orgId)
{
List posts=await_postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks=新列表();
foreach(var post in post)
{
Add(SetAuthor(post));
}
等待任务。WhenAll(authorSetTasks);
返回Ok(从发布的post中的post选择post);
}
专用异步任务SetAuthor(PostModel post)
{
UserModel author=await\u userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor=new UserModel();
saveAuthor.FirstName=author.FirstName;
saveAuthor.LastName=author.LastName;
post.Author=saveAuthor;
}
问题在于,您在ForEach
中使用的lambda基本上是一种异步void
方法,这意味着它是一种“火与忘”的方法。因此,您的代码将在设置完所有作者
属性之前到达返回
。相反,您应该使用普通的foreach(var post in posts)
,这样该方法将等待设置所有Author
属性。请注意,这可能只会在发行版中失败,因为这是一个竞争条件,调试可能会减慢速度,使其不会发生
或者,您可以将代码生成一个方法,并并行执行,然后等待所有任务完成后再返回
[HttpGet("public/{orgId}")]
public async Task<ActionResult<List<PostModel>>> GetAllPublicPostsByOrgId(string orgId)
{
List<PostModel> posts = await _postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks = new List<Task>();
foreach(var post in posts)
{
authorSetTasks.Add(SetAuthor(post));
}
await Task.WhenAll(authorSetTasks);
return Ok(from post in posts where post.Published select post);
}
private async Task SetAuthor(PostModel post)
{
UserModel author = await _userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor = new UserModel();
saveAuthor.FirstName = author.FirstName;
saveAuthor.LastName = author.LastName;
post.Author = saveAuthor;
}
[HttpGet(“public/{orgId}”)]
公共异步任务GetAllPublicPostsByOrgId(字符串orgId)
{
List posts=await_postRepository.GetAllPostsByOrgId(orgId);
var authorSetTasks=新列表();
foreach(var post in post)
{
Add(SetAuthor(post));
}
等待任务。WhenAll(authorSetTasks);
返回Ok(从发布的post中的post选择post);
}
专用异步任务SetAuthor(PostModel post)
{
UserModel author=await\u userRepository.GetUserById(post.AuthorId);
UserModel saveAuthor=new UserModel();
saveAuthor.FirstName=author.FirstName;
saveAuthor.LastName=author.LastName;
post.Author=saveAuthor;
}
你真的想把ForEach
中的所有代码都去掉,然后忘掉它吗?我建议切换到foreach(var post in posts)
。谢谢。它现在正在工作。发布一个答案,我可以给你的信用@此外,在获取PostModel
时,您可能希望让您的存储库填充作者,这样您就不必执行我猜是多个DB查询。当然,如果用户更新了,我不想用该作者更新所有帖子。因此,我只需将authorid保存在对象上,然后就可以使用最新信息查询用户。您真的想在ForEach
中触发所有代码,然后忘记它吗?我建议切换到foreach(var post in posts)
。谢谢。它现在正在工作。发布一个答案,我可以给你的信用@此外,在获取PostModel
时,您可能希望让您的存储库填充作者,这样您就不必执行我猜是多个DB查询。当然,如果用户更新了,我不想用该作者更新所有帖子。因此,我只需将authord保存在对象上,然后就可以使用最新信息查询用户。