我将API方法从标准MVC操作迁移到新的asp.net Web-API测试版,突然只读取属性不再序列化(都返回JSON)。这是预期的行为吗?
编辑:添加了代码示例
我有通过nuget包
引用的Newtonsoft.Json 4.0.8和System.Json 4.0 public IQueryable<Car> Gets()
{
return _carRepository.GetCars();
}
public class Car
{
public IEnumerable<Photo> Photos
{
get { return _photos; }
}
public string PreviewImageUrl // No longer serialized
{
get
{
var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault();
return mainImage != null ? mainImage.Url : (string.Empty);
}
}
}
}
答案 0 :(得分:10)
Beta附带的JsonMediaTypeFormatter
使用不支持只读属性的序列化程序(因为它们不能正确往返)。我们正在计划为下一个问题解决这个问题。
在平均时间内,您可以使用自定义JSON MediaTypeFormatter
实现,该实现使用Json.NET(有一个可用here)而不是内置格式化程序。
更新:另请查看Henrik关于挂钩JSON.NET格式化程序的博客:http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx
答案 1 :(得分:4)
我不知道这是否是预期的行为。我会说这是输入参数(因为你不能设置它们的值)而不是输出参数。所以我想说这是输出参数的错误。这是一个说明问题的例子:
型号:
public class Product
{
public Product()
{
Prop1 = "prop1 value";
Prop2 = "prop2 value";
Prop3 = "prop3 value";
}
public string Prop1 { get; set; }
[ReadOnly(true)]
public string Prop2 { get; set; }
public string Prop3 { get; protected set; }
}
控制器:
public class ProductsController : ApiController
{
public Product Get(int id)
{
return new Product();
}
}
请求:
api/products/5
结果:
{"Prop1":"prop1 value","Prop2":"prop2 value"}
因此,如果该属性没有公共设置器,则它不是序列化的,这看起来并不正常,因为在这种情况下Product
类被用作输出。
我建议打开连接票,以便Microsoft可以在发布之前修复此问题,或者至少告诉这是设计的。