2017-04-14 53 views
0

我试图创建一个webapi,从azure上从sqlserver检索数据,我得到了这个错误。 我在asp.net的WebAPI新的,这是我的第一页时,我是观看教程,我做他在做什么,但我得到这个错误从ADO.net检索并创建webApi

堆栈跟踪:

at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) 
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) 
at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) 
at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) 
at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) 
at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext() 

我控制器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using DataBaseAccess; 
namespace JoSaleWebApi.Controllers 
{ 
public class BrandController : ApiController 
{ 
    public IEnumerable<brand_Table> Get() 
    { 
     using (JoSaleDbEntities enitites = new JoSaleDbEntities()) 
     { 
      return enitites.brand_Table.ToList(); 
     } 

    } 
    public brand_Table Get(int id) 
    { 
     using (JoSaleDbEntities enitites = new JoSaleDbEntities()) 
     { 
      return enitites.brand_Table.FirstOrDefault(b => b.brand_id == id); 
     } 
    } 
}} 

ADO生成的类

namespace DataBaseAccess 
{ 
using System; 
using System.Collections.Generic; 

public partial class brand_Table 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public brand_Table() 
    { 
     this.branch_Table = new HashSet<branch_Table>(); 
     this.sale_Table = new HashSet<sale_Table>(); 
    } 

    public int brand_id { get; set; } 
    public string brand_name { get; set; } 
    public string brand_imageUrl { get; set; } 
    public int company_id { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<branch_Table> branch_Table { get; set; } 
    public virtual company_Table company_Table { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<sale_Table> sale_Table { get; set; } 
} 

}

webConfig

+0

什么问题?你没有发布任何代码。请澄清。 – Goose

+0

@Goose我添加了控制器代码和实体类的图片 –

+0

您需要将您的代码粘贴到问题中,而不是图像中。 – Goose

回答

0

根据您的堆栈跟踪和代码,我发现你没有对你的实体申请DataContract和XmlFormatter没有提供DataContractResolver。另一个问题是序列化与其他实体模型(company_Table)有关的实体模型(brand_Table)。这个关系导致自我引用循环异常,同时将实体序列化为JOSN或xml。要解决这些问题,可以在数据库上下文的构造方法中将LazyLoadingEnabled和ProxyCreationEnabled属性设置为false。

public JoSaleDbEntities() 
     : base("name=JoSaleDbEntities ") 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
    this.Configuration.ProxyCreationEnabled = false; 
}