无法在ASP.NET Web API

时间:2017-05-18 21:39:13

标签: c# asp.net asp.net-web-api

我正在研究一个ASP.NET Web API,只是试图从我的数据库中返回一些数据,但我一直收到这个错误:

  

' ObjectContent`1'类型无法序列化内容类型' application / xml的响应正文;字符集= UTF-8'

我已尝试将以下内容添加到Global.asax文件中,如同我的其他类似问题所示,但它所做的只是更改错误的格式。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

我的控制器如下所示:

public class SQLController : ApiController
{
    public IEnumerable<Alias> Get()
    {
        using (DatabaseEntities entities = new DatabaseEntities())
        {
            return entities.Aliases.ToList();
        }
    }

    public Alias Get(int id)
    {
        using (DatabaseEntities entities = new DatabaseEntities())
        {
            return entities.Aliases.FirstOrDefault(a => a.ID == id);
        }
    }
}

我尝试了一些与更简单的数据库非常相似的东西,它运行良好。我还读过,制作一个单独的数据模型可以解决这个问题吗?如果是这样,为什么,我将如何做到这一点?任何帮助,弄清楚我收到此错误的原因将不胜感激。

2 个答案:

答案 0 :(得分:1)

看起来像实体框架延迟加载相关实体并创建无限循环的问题。

您最好的选择是禁用延迟加载并手动加载相关对象。 可以为整个Context全局禁用延迟加载,仅针对某些关系甚至每个查询本地禁用。

Globaly:

public class BloggingContext : DbContext 
{ 
    public BloggingContext() 
    { 
        this.Configuration.LazyLoadingEnabled = false; 
    } 
}

本地:

using (DatabaseEntities entities = new DatabaseEntities())
{
    entities.Configuration.LazyLoadingEnabled = false;
    return entities.Aliases.FirstOrDefault(a => a.ID == id);
}

如果要禁用特定属性,则只需从导航属性中删除虚拟:

public class Blog 
{  
    public int BlogId { get; set; }  
    public string Name { get; set; }  
    public string Url { get; set; }  
    public string Tags { get; set; }  

    public ICollection<Post> Posts { get; set; }  
}

有关此内容的更多数据,请参阅官方micrsofot文档https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

答案 1 :(得分:0)

试试这个

使用“IHttpActionResult”作为返回类型

[HttpGet]   
public IHttpActionResult Get()
{
    using (DatabaseEntities entities = new DatabaseEntities())
    {
        return Ok(entities.Aliases.ToList());
    }
}

public IHttpActionResult Get(int id)
{
    using (DatabaseEntities entities = new DatabaseEntities())
    {
         return Ok(entities.Aliases.FirstOrDefault(a => a.ID == id));
    }
}