【问题标题】:ASP.NET MVC Sending Json Object with 500 internal status codeASP.NET MVC 发送带有 500 个内部状态码的 Json 对象
【发布时间】:2017-03-03 07:17:32
【问题描述】:

我们先来看代码块;

发送json数据的控制器函数

[HttpGet]
public ActionResult LoadCourseForDataTable()
{
    using (var dd = new DBContext())
    {
        var data = dd.Courses.ToList();
        return Json(new {data = data}, JsonRequestBehavior.AllowGet);
    }             
}

这个块从上面的代码块中获取json数据;

<script>
    $(document).ready(function () {
        $('#CourseTable').DataTable({
            "ajax": {
                "url": "/Course/LoadCourseForDataTable",
                "type": "GET",
                "datatype": "json",
            },
            "columns": [
                { "data": "CourseID", "autoWidth": true },
                { "data": "Title", "autoWidth": true },
                { "data": "Credits", "autoWidth": true },
                { "data": "DepartmentID", "autoWidth": true },
            ]
        });
    });
</script>

必须在客户端服务器上加载的所有库完全完成并正确加载。他们在这个问题上没有问题。

服务器响应是 500 内部错误

这里是详细的异常;

ObjectContext 实例已被释放,不能再用于需要连接的操作。

我认为一切都是真的,但我有一个有趣的问题。你能帮助我吗?谢谢你 。 . .

【问题讨论】:

  • 500 Internal Server Error) 表示服务器上的代码正在抛出异常。使用您的浏览器工具(网络选项卡)检查响应,该响应将为您提供错误的详细信息。
  • 服务器也会给出相当详细的错误信息。错误是什么?
  • 编辑了问题。请检查它。
  • 删除using 语句,或将return Json() 移到它后面。
  • 尝试使用带有Select 方法的投影仅返回必填字段。还要确保Course 的属性是虚拟的。

标签: asp.net json asp.net-mvc


【解决方案1】:

这很可能是因为您启用了延迟加载。当您处理 DBContext 时,您将关闭与数据库的连接,因此在您关闭 using 语句后它无法加载任何相关实体。

问题是该 using 语句中的 dispose 是在传递该方法的结果之前运行的。当 JsonResult 尝试序列化您的课程时,他们会看到有一个 Lazy Loaded 属性并尝试加载它。但此时与数据库的连接已关闭。

我严格反对网络场景中的延迟加载。出于这个原因和许多其他原因。所以我给你的唯一建议是禁用延迟加载,如果你想包含相关实体,你应该急切地获取它们。

【讨论】:

  • 我认为这个问题是重复的,但你的回答很清楚,我谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2016-08-17
  • 2012-07-07
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多