【问题标题】:.Net Core WebAPI connection reset, when I have "include" in my controller当我的控制器中有“包含”时,.Net Core WebAPI 连接重置
【发布时间】:2017-11-03 12:05:34
【问题描述】:

我有一个使用 .Net Core 的新项目。这是一个 WebAPI 项目。我的模型有一个单独的项目。

在 WebAPI 项目中,在控制器中,我有这样的东西:

    // GET: api/questions
    [HttpGet]
    public IEnumerable<Question> GetQuestions()
    {
        return _context.Questions
            .Include( i => i.QuestionType );
    }

当我调用http://localhost:55555/api/questios/ 时,它只返回第一条记录,然后是以下错误消息: 接收失败:连接已重置

如果我删除Include 部分并返回_context.Questions,它就可以正常工作!

我的代码有什么问题?

【问题讨论】:

  • 是否启用了延迟加载?也许您可以将实体扁平化为 List 对象以了解原因。
  • 要调试它,将返回值包装在 try/catch 中,然后在 .Include 之后添加 .ToList()
  • 如何在控制器中注入上下文?通过 DI 服务?
  • @ali 延迟加载在 EF Core 中仍然不可用
  • 看看这个问题,可能是同样的错误:github.com/aspnet/Mvc/issues/5910

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

我找到了答案。感谢所有帮助过的人。

我根据Loading related data添加了json选项

如果您使用的是 ASP.NET Core,则可以将 Json.NET 配置为忽略它在对象图中找到的循环。这是在 Startup.cs 的 ConfigureServices(...) 方法中完成的。

            services.AddMvc()
              .AddJsonOptions(
                    options => options.SerializerSettings.ReferenceLoopHandling
                        = Newtonsoft.Json.ReferenceLoopHandling.Ignore );

【讨论】:

  • 我发现这解决了我的问题,但后来我发现了另一种我认为我更喜欢的方式。我将[JsonIgnore] 装饰器添加到我不想序列化的属性中,并且不再需要担心任何循环。我怀疑这通常是孩子对父母的参考。有关详细信息,请参阅此答案:stackoverflow.com/a/11851461/5322405
  • 很棒的补充,@KenLyon。我还不确定这是我的确切问题,但我一直在使用 ReferenceLoopHandling.Ignore 并且更喜欢装饰器解决方案。
  • 啊!我发现我确实在services.AddMvc() 中设置了ReferenceLoopHandling.Ignore,但是因为我在特定 Json() 调用中添加了JsonSerializerSettings,所以它被覆盖了。
【解决方案2】:

试试这个:

// GET: api/questions
[HttpGet]
public IEnumerable<Question> GetQuestions()
{
    var res = _context.Questions
        .Include( i => i.QuestionType ).ToArray();
    return res;
}

【讨论】:

  • 和以前一样。
  • 你能包括其他相关实体吗?还是您包含的所有内容都会出现相同的错误?
  • 我已经更新了代码。尝试使用断点调试它以观察“res”变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多