如何使用 System.Web.Http.OData.Delta 修补枚举?

2024-04-26

尝试利用System.Web.Http.OData.Delta http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx实施PATCH https://www.rfc-editor.org/rfc/rfc5789ASP.NET Web API 服务中的方法,但似乎无法将更改应用于类型的属性IEnumerable<T>。我正在使用 Delta 的最新 Git 版本 (2012.2-rc-76-g8a73abe)。有人能够做到这一点吗?

考虑这种数据类型,应该可以在对 Web API 服务的 PATCH 请求中更新该数据类型:

public class Person
{
    HashSet<int> _friends = new HashSet<int>();

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public IEnumerable<int> Friends
    {
        get { return _friends; }
        set
        {
            _friends = value != null ? new HashSet<int>(value) : new HashSet<int>();
        }
    }

    public Person(int id, string firstName, string lastName)
    {
        Id = id;
        FirstName = firstName;
        LastName = lastName;
    }

    public Person()
    {
    }
}

此 Web API 方法通过以下方式实现对 Person 的修补Delta<Person>:

public void Patch(int id, Delta<Person> delta)
{
    var person = _persons.Single(p => p.Id == id);
    delta.Patch(person);
}

如果我向服务发送包含以下 JSON 的 PATCH 请求,则该人的Friends属性应该更新,但遗憾的是它没有发生:

{"Friends": [1]}

问题的关键其实是如何让Delta更新Friends有了这个数据。另请参阅CodePlex 上的讨论 http://aspnetwebstack.codeplex.com/discussions/429382.


问题可能是 Deta 会尝试分配 JSONJArray给你的Hashset<int>

如果您将它用于 JsonMEdiaTypeFormatter 并且您内部化了 Delta 代码(意味着您可以修改它),您必须执行类似的操作(这很粗糙,但有效):

里面,bool TrySetPropertyValue(string name, object value) of Delta<T>,它返回 false:

        if (value != null && !cacheHit.Property.PropertyType.IsPrimitive && !isGuid && !cacheHit.Property.PropertyType.IsAssignableFrom(value.GetType()))
        {
           return false;
        }

改成:

var valueType = value.GetType();
var propertyType = cacheHit.Property.PropertyType;
if (value != null && !propertyType.IsPrimitive && !propertyType.IsAssignableFrom(valueType))
{
    var array = value as JArray;
    if (array == null)
        return false;

    var underlyingType = propertyType.GetGenericArguments().FirstOrDefault() ??
        propertyType.GetElementType();
    if (underlyingType == typeof(string))
    {
        var a = array.ToObject<IEnumerable<string>>();
        value = Activator.CreateInstance(propertyType, a);
    }
    else if (underlyingType == typeof(int))
    {
        var a = array.ToObject<IEnumerable<int>>();
        value = Activator.CreateInstance(propertyType, a);
    }
    else
        return false;
}

这仅适用于集合int or string但希望能把你推向一个好的方向。

例如,现在您的模型可以具有:

public class Team {
        public HashSet<string> PlayerIds { get; set; }
        public List<int> CoachIds { get; set; }
    }

并且您将能够成功更新它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 System.Web.Http.OData.Delta 修补枚举? 的相关文章

  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • .NET Web API - 添加日志记录

    我正在寻找有关处理 API 日志记录的最佳方法的帮助 我想将所有请求和响应记录到 sql 或文本文件 如果这是最好的方法 目前我已经在 SQL Server 的日志表中插入一行 我使用名为 LogAction 的静态方法来执行此操作 并在
  • asp.net web api 中具有两个参数的方法

    如何使用 ASP NET Web Api 创建具有两个参数的方法 这样我就可以像 localhost controller param1 param2 那样调用它 您还可以在查询字符串中使用特定参数名称来调用 url api actions
  • 如何将 OData 查询字符串转换为 .NET 表达式树

    完全重写这个问题 因为我现在比以前理解得更多 我试图将 OData 查询字符串直接抽象为 NET 表达式树 似乎有很多关于此的问题和文章 但没有答案提供依赖于的抽象解决方案soley on the Microsoft Data OData命
  • gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗?

    目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量 目前 该应用程序使用REST with HTTP 1 1并且我们遇到了很高的延迟 我需要解决这个延迟问题并且我愿意使用gRPC HTTP 2 or 休息 HTTP2
  • 如何强制 Web API 识别查询字符串参数

    ASP NET MVC4 Web API v1 控制器定义如下 它应该接受 1 或 2 个查询字符串参数 然而 如果调用方法 ko 参数始终为 null 请求如下 如何修复以便 kclient 或 namepart 参数可以在查询字符串中传
  • JAX-RS 多态 POST 请求:我应该如何编写 JSON?

    我在尝试用 JAX RS 解决这个问题时遇到了麻烦 我相信它与编组 解组过程有关 我认为我对此不太了解 并且我想重新创建这个 发帖的 REST 端点是 rest register 所以我的服务定义如下 ApplicationPath res
  • 对过期会话进行休息调用:HTTP 401 响应导致浏览器显示登录窗口

    我编写了一个 HTML 5 应用程序 它使用 AngularJS 并与在 Tomcat 上运行的 Java REST 后端进行交互 我使用 Spring Security 来处理登录和安全性 当用户进入网站时 他将被转发到登录页面 该页面创
  • Flask API TypeError:“Response”类型的对象不可 JSON 序列化

    我在使用 Python Flask Restful API 时遇到问题 并且数据发送到 Elasticsearch 当我使用 Postman 发布新数据时 问题是 类型错误 响应 类型的对象不可 JSON 序列化 你能帮助我吗 Model
  • Jersey 将 Weld 托管 bean 注入 ConstraintValidator

    我已经花了几个小时寻找解决方案来解决我的问题 但我无法让它发挥作用 我想将 Weld 管理的服务注入 ConstraintValidator 中 该 ConstraintValidator 用于验证发布到 JAX RS Rest Servi
  • 在(每个)Web API 操作之前执行代码

    我有一个 Web API 接口 我正在尝试适应多租户架构 以前 我们采用 WCF 模式 将参数 客户端 ID 传递给服务 然后服务将其存储起来以供稍后在代码中使用 这意味着客户端 ID 不必是传递给每个调用的第一个参数 我想对 Web AP
  • WCF Rest 服务还是 ASP.NET MVC 控制器/操作?

    如果有人能提供一些关于哪种更有益的见解 我将不胜感激 WCF 中的 RESTful 服务可以提供与 ASP Net MVC 控制器相同的功能 即可以使用控制器 操作适当地形成 URL 使用其中一种比另一种有真正的好处吗 WCF休息服务将提供
  • 如何在WCF Rest服务中从流上传图像

    我正在尝试创建 wcf 服务 该服务将上传 pdf doc xls 图像等文件 但 pdf txt 文件正在上传并正确打开 但是当我尝试上传图像文件时 文件正在上传 但是图像不可见 OperationContract WebInvoke M
  • 如何在 Jersey 容器中配置欢迎文件 (HTML/JSP)

    我有一个 Jersey RESTful Web 服务项目 我已经在中配置了 Jersey 容器web xml一切正常 在同一个项目中 我引入了一个 HTML 页面并包含在
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • 在哪里放置资源特定逻辑

    您能帮我考虑在 AngularJS 中将资源 服务 特定的业务逻辑放置在哪里吗 我觉得在我的资源上创建一些类似模型的抽象应该很棒 但我不确定如何做 API调用 gt GET customers 1 lt first name John la
  • I/O 问题没有找到类 org.json.JSONObject 的序列化器,也没有发现创建 BeanSerializer 的属性

    不确定发生了什么 完整的错误是 Problem with i o No serializer found for class org json JSONObject and no properties discovered to creat
  • Angular 6 Asp.Net(非 Core)Web Api CORS 请求失败

    我正在构建一个 Net Web Api 它将由 Angular 6 客户端使用 但出于某种原因 我无法使其在我的开发环境中工作 我从一个非常简单的 Web Api 开始 它只返回一个字符串 用于前端和后端测试目的之间的通信 GET api
  • Asp.net WEB API - 如果我使用 POST 而不是 PUT 和 DELETE 会出现什么问题?

    我刚刚开始使用 Web API 虽然我发现创建我需要的方法和一些配置非常容易 但现在我遇到了一个我不知道如何解决的问题 一些将使用我的服务的应用程序非常旧 不支持 DELETE 和 PUT 方法 例如 j2me 应用程序 我发现可以通过传递
  • 如何使用继承来建模 RESTful API?

    我有一个需要通过 RESTful API 公开的对象层次结构 但我不确定我的 URL 应该如何构建以及它们应该返回什么 我找不到任何最佳实践 假设我有从动物继承的狗和猫 我需要对狗和猫进行CRUD操作 我还希望能够对一般动物进行手术 我的第

随机推荐