c# - 使用 ASP.Net MVC 5 和 Web API 2.0 在 OData 中进行 Dictionary<string, object> 序列化

标签 c# asp.net asp.net-web-api odata asp.net-mvc-5

我在 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/

相关文章:

javascript - 如何阻止 Javascript 将日期转换为除法?

c# - 在这种解耦层的尝试中,命令模式的适用性如何?

configuration - ASP.NET Web API : Project requires SQL Server Express

c# - EntityFramework 抛出错误 : The table does not have a primary key defined

asp.net OAuth token 错误 401 : unauthorized

c# - 在 C# 中使用 linq 计算 IEnumerable 中项目的出现次数

c# - Azure 辅助角色从 Linux VM 复制文件

asp.net - 哪些 SharePoint 开发概念对于 ASP.Net 开发人员来说最难理解?

asp.net - 如何验证 asp 中的文本框是否有不平衡的括号

c# - 为什么在将 ApplicationCookie 与 ASP.Net Identity 一起使用之前调用 SignOut(DefaultAuthenticationTypes.ExternalCookie)?