调试模式运行,发布失败

时间:2019-07-07 12:38:00

标签: c# asp.net asp.net-mvc

我正在尝试将我的asp.net应用程序投入生产。但是,当我在生产环境中运行该应用程序时,某条路线无法很好地工作。它说post.Author == null。当我在调试中运行该应用程序时,即使没有断点,它也可以很好地运行。

我在发布版本中尝试了该应用程序,或者仅使用了骑手中的“开始”按钮,两者均无效。

那是我要调试的路由。我也有其他一些路线的问题。

[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);
}

作者应该为null,它应该是具有属性的对象。

编辑:我尝试在该路由器上使用[MethodImpl(MethodImplOptions.NoOptimization)]。那也没有用。

1 个答案:

答案 0 :(得分:2)

问题在于,您在ForEach中使用的lambda基本上是一种async void方法,这意味着它会被抛弃。因此,您的代码将在完成所有return属性的设置之前进入Author。相反,您应该使用普通的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;
}