2017-04-14 54 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; 
}