4

尝试使用 Web API 控制器时出现此错误。

Web API 错误:“ObjectContent`1”类型无法序列化内容类型的响应正文

我的控制器中的代码如下

public IEnumerable<Student> GetAllStudents()
    {
        var allstudents = unitOfWork.StudentRepository.Get(includeProperties: "Groups");


        return allstudents;
    }

    public Student GetStudentByID(Guid id)
    {
        return unitOfWork.StudentRepository.GetByID(id);
    }

我的“学生”课程如下

public partial class Student
{
    public Student()
    {
        this.Groups = new HashSet<Group>();
    }

    public System.Guid StudentID { get; set; }
    public string Surname { get; set; }
    public string FirstName { get; set; }
    public byte[] Timestamp { get; set; }

    public virtual Course Course { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
}

两种方法都会导致相同的错误。

我的内心异常如下

键入“System.Data.Entity.DynamicProxies.Student_4C97D068E1AD0BA62C3C6E441601FFB7418AD2D635F7F1C14B64F4B2BE32DF9A”数据合同名称“Student_4C97D068E1AD0BA62C3C6E441601FFB7418AD2D635F7F1C14B64F4B2BE32DF9A:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ”预计不会。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。

我觉得我需要使用该KnownType属性,但我不确定如何实现它。

任何帮助,将不胜感激

4

2 回答 2

7

如果您不需要代理类 ( System.Data.Entity.DynamicProxies.Student_4C97D068E1A...) 提供的延迟加载导航属性,您可以通过设置禁用它们的生成:

unitOfWork.Configuration.ProxyCreationEnabled = false;

如果需要代理类怎么办是另一个问题


按照这些链接可以很好地了解延迟加载和代理:

我通常默认禁用延迟加载和代理,并在需要它们的特定代码块中启用一个或两个。

于 2013-03-08T17:34:32.547 回答
1

什么是内部异常消息?内部异常消息将是序列化程序抛出的实际异常,它应该告诉我们是哪种类型导致了异常。

让我猜猜 - 是任何类型Course和类型Group吗?如果是这样,请尝试将KnownType属性放在您的实际实现类型上class Student

[KnownType(typeof(GroupA))]
[KnownType(typeof(CourseA))]
public partial class Student
{...}

public class GroupA : Group {...}
public class CourseA : Course {...}

public interface Group {...}
public interface Course {...}
于 2012-10-17T15:23:29.410 回答