在Web Api 2中从OData客户端调用补丁的正确方法是什么

 景科儒_189 发布于 2023-01-30 18:39

在web api团队创建的OData示例之后,我的控制器具有以下支持补丁:

public HttpResponseMessage Patch([FromODataUri] int key, Delta item)
{
  var dbVersion = myDb.GetById(key);
  if(dbVersion == null)
    throw Request.EntityNotFound();

  item.Patch(dbVersion);
  myDb.Update(dbVersion);

  return Request.CreateResponse(HttpStatusCode.NoContent);
}

并使用自动生成的客户端(派生自DataServiceContext),我提交了这样的补丁请求:

var foo = svcContainer.Foos.Where (f => f.Id == 1).SingleOrDefault();
foo.Description = "Updated Description";
svcContainer.UpdateObject(foo);
svcContainer.SaveChanges(SaveChangesOptions.PatchOnUpdate);

但是,在fiddler中跟踪调用,我看到Foo的所有其他属性都被序列化并发送到服务.这是正确的行为吗?我希望只通过网络发送ID和描述.另外,如果我调试服务方法并调用

GetChangedPropertyNames 在item上,返回其所有属性名称.

我应该在客户端上创建某种Delta实例吗?

我理解服务的断开性质,因此服务端没有用于跟踪更改的上下文,但在我看来,api团队为某个原因添加了对补丁的支持,所以我想知道客户端是否应该以不同的方式调用更新.

更新

YiDing提供的链接解释了如何从客户端创建一个真正的PATCH请求(使用Microsoft.OData.Client.DataServiceContextMicrosoft.OData.Client 6.2.0上面和上面创建的.为方便起见,这里是代码片段:

var svcContainer = new Default.Container();
var changeTracker = new DataServiceCollection(svcContainer.Foos.Where(f => f.Id == 1));
changeTracker[0].Description = "Patched Description";
svcContainer.SaveChanges();

DataServiceCollection工具财物跟踪,并使用这种模式,只有更新的属性发送到服务.不使用DataServiceCollection和简单使用

svcContainer.UpdateObject(foo);
svcContainer.SaveChanges();

所有属性仍然通过电线发送,尽管相反的文档,至少是 Microsoft.OData.Client 6.7.0

1 个回答
  • 现在,Microsoft.OData.Client版本6.2.0支持客户端属性跟踪.它将仅检测实体的已修改属性,并将更新请求作为PATCH而不是PUT发送,以满足您的方案的要求.有关更多详细信息,请参阅此博客文章:http: //blogs.msdn.com/b/odatateam/archive/2014/04/10/client-property-tracking-for-patch.aspx

    2023-01-30 18:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有