我在 MVC 5 的新 Web API 上使用 OData 服务,但遇到了一些问题。
我关注了this tutorial开始开发 OData 服务,几乎一切正常。项目已构建,路由有效,URL 运行良好。
我的一门课叫做 Post
并拥有 Dictionary<string, object>
类型的属性名为 Parameters
,如下所示:
public partial class Post : IPost
{
public Guid Id { get; set; }
public string Author{ get; set; }
public string Content{ get; set; }
public DateTime PostedDate{ get; set; }
public List<Photo> Pictures { get; set; }
public Dictionary<string, object> Parameters { get; set; }
}
列出所有 Post
的 URL当我在浏览器中执行获取请求时,对象 ( http://localhost/odata/Posts
) 工作正常。所有对象都成功序列化。
但是当我得到 Post
的列表时,将 OData 元数据作为服务引用导入到另一个应用程序中实体,我收到以下错误:
An exception of type 'System.InvalidOperationException' occurred in Microsoft.Data.OData.dll but was not handled in user code
Additional information: The type 'WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object' has no settable properties.
如何成功解决导入服务引用的这个问题?
最佳答案
几天后,我尝试了很多不同的测试。
-
Dictionary<string, object>
=> 抛出原始错误 -
Dictionary<string, string>
=>同样的错误 -
List<KeyValuePair<string, object>>
=>同样的错误 -
List<KeyValuePair<string, string>>
=>同样的错误
我意识到 KeyValuePair
类是问题,但我不知道为什么。
因此,我创建了一个名为 Parameter
的类如下所示:
public class Parameter
{
public string Key { get; set; }
public string Value { get; set; }
}
...我将列表类型更改为 List<Parameter>
它奏效了!
问题经过深思熟虑,我意识到错误中的一个重要句子:
'WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object' has no settable properties
字典只不过是 KeyValue 对的列表,以及 KeyValuePair<TKey, TValue>
struct 有两个属性,名为“Key”和“Value”,它们只有 get 访问器。因此,它们是只读的。
我们可能会得出结论,OData 服务引用无法反序列化只读属性,出于某种我还不知道的原因。
我的解决方法奏效了,但我想知道服务引用是否有朝一日可以通过反射方式来设置此属性。
关于c# - 使用 ASP.Net MVC 5 和 Web API 2.0 在 OData 中进行 Dictionary<string, object> 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869819/