Web API - 返回复杂对象列表时出错

Jep*_*fod 2 c# serialization asp.net-web-api asp.net-web-api2

我创建了一个webAPI控制器方法,它看起来如下:

 [HttpGet]
 public HttpResponseMessage RealEstates()
 {
     using (BoligsideDbContext context = new BoligsideDbContext())
     {
         List<RealEstateVm> realEstateVms = context.RealEstates.OrderByDescending(x => x.Id).ToList().Select(x => new RealEstateVm(x)).ToList();

          return Request.CreateResponse(HttpStatusCode.OK, realEstateVms);
     }
}
Run Code Online (Sandbox Code Playgroud)

我的VM看起来如下:

public class RealEstateVm
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public int Area { get; set; }
        public int Rooms { get; set; }
        public int Rent { get; set; }
        public string Picture { get; set; }
        public RealEstateType Type { get; set; } //this is just an enum
        public string Address { get; set; }
        public List<string> Images { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public string Phone2 { get; set; }
        public string OriginalUrl { get; set; }
        public string OriginalSource { get; set; }
        public string City { get; set; }
        public int ZipCode { get; set; }
        public string StreetAddress { get; set; }
        public double Longtitude { get; set; }
        public double Latitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是每当我进入端点时,我都会收到以下错误:

类型'Boligside.ViewModels.RealEstateVm'无法序列化.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.

可能是什么问题?我不明白为什么我要用[DataContractAttribute]标记我的VM?

顺便说一下,完整的错误消息在这里:

此XML文件似乎没有与之关联的任何样式信息.文档树如下所示.发生了错误.'ObjectContent`1'类型无法序列化内容类型'application/xml的响应主体; 字符集= UTF-8' .System.InvalidOperationException发生错误.类型'Boligside.ViewModels.RealEstateVm'无法序列化.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.系统中的System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message,Type type)System.Runtime.Serialization.InvalidDataContractException System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id,RuntimeTypeHandle typeHandle,Type type) System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter)中System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContract(Int32 id,RuntimeTypeHandle typeHandle)的.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id,RuntimeTypeHandle typeHandle,Type type) System.Runtime.Serialization.CollectionDataC上的WriteArrayOfRealEstateVmToXml(XmlWriterDelegator,Object,XmlObjectSerializerWriteContext,CollectionDataContract)中的,Object obj,Boolean isDeclaredType,Boolean writeXsiType,Int32 declaredTypeID,RuntimeTypeHandle declaredTypeHandle)ontract.WriteXmlValue(XmlWriterDelegator的XmlWriter,对象OBJ,XmlObjectSerializerWriteContext上下文)在System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract,XmlWriterDelegator的XmlWriter,对象OBJ,的RuntimeTypeHandle declaredTypeHandle)在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract,在System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer,Object graph,DataContractResolver dataContractResolver)的System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer,Object graph,DataContractResolver dataContractResolver)中的XmlWriterDelegator xmlWriter,Object obj,RuntimeTypeHandle declaredTypeHandle) System.Runtime中的System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer,Object graph,DataContractResolver dataContractResolver)System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync上的System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,HttpContent content)中的.Serialization.DataContractSerializer.WriteObject(XmlWriter writer,Object graph) (类型类型,对象值,流writeStream,HttpContent内容,TransportContext transportContext,CancellationToken cancellationToken)---从抛出异常的先前位置开始的堆栈跟踪---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

小智 6

正如错误所说,它无法序列化并考虑添加数据契约属性.

using System.Runtime.Serialization;
[DataContract]
public class RealEstateVm
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Title { get; set; }
        [DataMember]
        public string Description { get; set; }
        [DataMember]
        public int Area { get; set; }
        [DataMember]
        public int Rooms { get; set; }
        [DataMember]
        public int Rent { get; set; }
        [DataMember]
        public string Picture { get; set; }
        [DataMember]
        public RealEstateType Type { get; set; } //this is just an enum
        public string Address { get; set; }
        [DataMember]
        public List<string> Images { get; set; }
        public string Name { get; set; }
        [DataMember]
        public string Email { get; set; }
        [DataMember]
        public string Phone { get; set; }
        [DataMember]
        public string Phone2 { get; set; }
        [DataMember]
        public string OriginalUrl { get; set; }
        [DataMember]
        public string OriginalSource { get; set; }
        [DataMember]
        public string City { get; set; }
        [DataMember]
        public int ZipCode { get; set; }
        [DataMember]
        public string StreetAddress { get; set; }
        [DataMember]
        public double Longtitude { get; set; }
        [DataMember]
        public double Latitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有关数据合同的更多信息

  • 那是有效的,但我不明白为什么这是必要的.我特别记得不必将datamember属性添加到简单类型. (4认同)

小智 6

您的DTO类缺少无参数构造函数.看到这里:为什么XML-Serializable类需要一个无参数构造函数 (很抱歉醒来这个问题,但我现在遇到同样的问题)