Rest 未能序列化内容类型的响应正文

Rest 未能序列化内容类型的响应正文,rest,fluent-nhibernate,asp.net-mvc-4,asp.net-web-api,Rest,Fluent Nhibernate,Asp.net Mvc 4,Asp.net Web Api,我正在构建一个同时使用控制器和APIController的MVC4应用程序。我修改了默认的WebAPI路由以包含操作名称。当我尝试获取基准列表时,会收到以下错误消息: ObjectContent“1”类型未能序列化的响应正文 内容类型'application/json;字符集=utf-8' InnerException是这样的(在这种情况下,我返回JSON,XML也是如此): NHibernate框架中的似乎有[SerializableAttribute]注释 从回答中的注释中可以看出,JSON

我正在构建一个同时使用控制器和APIController的MVC4应用程序。我修改了默认的WebAPI路由以包含操作名称。当我尝试获取基准列表时,会收到以下错误消息:

ObjectContent“1”类型未能序列化的响应正文 内容类型'application/json;字符集=utf-8'

InnerException是这样的(在这种情况下,我返回JSON,XML也是如此):

NHibernate框架中的似乎有
[SerializableAttribute]
注释

从回答中的注释中可以看出,JSON.NET在WebApi使用和独立使用之间的配置略有不同

默认情况下,Json.NET序列化程序将IgnoreSerializableAttribute设置为true。在WebAPI中,我们将其设置为false

因此,如果您无法关闭
[SerializableAttribute]
(因为它不在您的代码中),您可以尝试使用以下答案更改默认WebApi JSON.NET设置以忽略它:


也可以考虑使用DTO来在响应中发送您的结果,这将使您完全控制通过导线发送的对象。

HMM,以下可能有所帮助。

我得到了相同的异常,在我的例子中,我首先传递为实体代码创建的实际poco实体。因为它包含诸如IList位置之类的导航属性,所以我只是在它上面创建了viewmapper/dto实体来返回

现在可以找到了

Poco实体:

public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}
公共类标记
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共IList位置{get;set;}
}
视图映射器/Dto

public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}
公共类标记结果视图映射器
{
公共int Id{get;set;}
公共字符串标题{get;set;}
//只需删除以下关系
//公共IList位置{get;set;}
}

这修复了JSON错误,祝XML好运。将其添加到Register方法下的WebApiConfig类中

  var json = config.Formatters.JsonFormatter;
  json.SerializerSettings.PreserveReferencesHandling=Newtonsoft.Json.PreserveReferencesHandling.Objects;
  config.Formatters.Remove(config.Formatters.XmlFormatter);
更新:

我找到了两种解决办法。第一个也是最容易实现的是将任何IEnumerables、ICollections更改为列表类型。WebAPI可以序列化此对象,但不能序列化接口类型

public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }
公共类存储
{
[第(5)款]
公共字符串Zip5{get;set;}
公共虚拟列表StoreReports{get;set;}//在此处使用列表
}

另一个选择是不使用本机JSON序列化程序。我发布的第一个方法仍然有效。

确实解决了这个问题!现在我遇到了另一个问题,因为一个函数不是由NHibernate实现的,但这是另一个主题。只需将该代码添加到
WebApiConfig.cs
?为什么这里涉及到
NHibernate
?从类中删除整个关系很难解决问题。@RaySülzer它在特定的环境中对我有效。也许你有不同的问题。然而,我从另一个角度来看待这个问题。也许有人能从中受益。你为什么投了反对票。我可以向您发送示例/演示来证明这一点。所以,请不要投票,而不要投反对票,但你返回的是一个完全不同的类。。。为什么不从原始类中删除公共IList?人们之所以会遇到这个问题,是因为他们需要使用Enity框架对ICollections进行序列化,而微软却无耻地忽略了这一需要。好吧,这只是一个例子。无论何时更改ef poco实体。您将如何命名它为dto、viewmapper或您想如何命名它。自,如果从ef poco中删除导航属性。它将打破实体关联。因此,我们的想法是保持域设计的原样,只获取所需信息。+1这让我一整天都处于困境,这就是让这一切发生的答案。非常感谢你!!我还在需要的地方添加了
[JsonIgnore]
,以便在web api中使用实体框架未跟踪的ViewModel,并且此解决方案成功地序列化了我的新类型
((DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}
public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}
  var json = config.Formatters.JsonFormatter;
  json.SerializerSettings.PreserveReferencesHandling=Newtonsoft.Json.PreserveReferencesHandling.Objects;
  config.Formatters.Remove(config.Formatters.XmlFormatter);
public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }