C# 调试模式运行,发布失败

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

我正在尝试将我的asp.net应用程序投入生产。但是,当我在生产环境中运行应用程序时,某个路径并不能很好地工作。它说post.Author==null。当我在debug中运行应用程序时,它运行良好,即使没有断点

我在一个发布版本中尝试了这个应用程序,或者只是在rider中使用了start按钮,但两者都不起作用

这就是我试图调试的路线。我也有其他路线的问题

[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保存在对象上,然后就可以使用最新信息查询用户。