Rest 未能序列化内容类型的响应正文
我正在构建一个同时使用控制器和APIController的MVC4应用程序。我修改了默认的WebAPI路由以包含操作名称。当我尝试获取基准列表时,会收到以下错误消息: ObjectContent“1”类型未能序列化的响应正文 内容类型'application/json;字符集=utf-8' InnerException是这样的(在这种情况下,我返回JSON,XML也是如此): NHibernate框架中的似乎有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
[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
}