最近我用EF4设置了WCF休息服务 . 返回XML格式响应时,一切都很顺利 . 但是当谈到JSON时,我得到了504错误 . unable to return json data, WCF Resful Service .NET 4.0
通过使用服务跟踪查看器深入挖掘:我发现此错误:
'类型'xxx.DataEntity.AppView'无法序列化为JSON,因为其IsReference设置为“True” . JSON格式不支持引用,因为没有用于表示引用的标准化格式 . 要启用序列化,请在类型或相应类型的父类上禁用IsReference设置 .
“AppView”是一个复杂的对象类,由EF4从商店过程生成 . 我花了相当多的时间谷歌如何禁用IsReference,到目前为止很少有结果 .
任何人?有什么解决方案?
提前致谢
码:
[OperationContract]
[WebInvoke(Method = "GET",
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "App/{id}/{format}")]
AppView FuncDetail(string id, string format);
public AppView FuncDetail(string id, string format)
{
SetResponseFormat(format);
return AppSvcs.GetById(id);
}
private void SetResponseFormat(string format)
{
if (format.ToLower() == "json")
{
ResponseContext.Format = WebMessageFormat.Json;
}
else
{
ResponseContext.Format = WebMessageFormat.Xml;
}
}
4 回答
我遇到了完全相同的问题 . 它只发生在我试图返回JSON序列化实体对象的一个服务方法上 . 对于我所有的其他方法,我正在返回JSON序列化数据传输对象(DTO),这些对象是独立的,没有连接到Entity框架 . 我正在使用DTO将数据发布到方法中 . 通常,您发送的数据不需要存储在模型或数据库中的所有数据,例如ID值,更新日期等 . 映射在模型类中完成,如下所示:
它可能看起来有点笨重,但它可以工作,它确保您只发送您想要发回的数据字段 . 它适用于我,因为我只有5或6个实体,但我可以看到,如果你有很多类,它会变得有点乏味 .
我遇到了同样的问题,因为使用了自动生成的ADO实体模型 . 我没有找到针对此问题的直接修复,但作为一种解决方法,我将响应序列化为json .
所以在你的例子中,AppView FuncDetail看起来像这样:
以下是我正在使用的Serializers:
}
使用实体元数据而不是反射更清晰 . 元数据非常广泛 .
另一种方法是使用LINQ创建一个匿名类型,其中包含您需要从实体获得的字段子集,然后使用JSON.NET来序列化您在LINQ语句中创建的非类型集合 . 然后通过序列化将该集合作为字符串保留 .