gpt4 book ai didi

asp.net-web-api - 从 Web Api 2 中的 OData 客户端调用补丁的正确方法是什么

转载 作者:行者123 更新时间:2023-12-04 08:25:45 25 4
gpt4 key购买 nike

按照 web api 团队创建的 OData 示例,我的 Controller 具有以下支持补丁:

public HttpResponseMessage Patch([FromODataUri] int key, Delta<Foo> 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 和 Description。另外,如果我调试服务方法并调用
GetChangedPropertyNames在 item 上,返回其所有属性名称。

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

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

更新

YiDing 提供的链接解释了如何从客户端创建真正的 PATCH 请求(使用 Microsoft.OData.Client.DataServiceContext 及以上创建的 Microsoft.OData.Client 6.2.0
为方便起见,这里是代码片段:
var svcContainer = new Default.Container(<svcUri>);
var changeTracker = new DataServiceCollection<Foo>(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

最佳答案

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

关于asp.net-web-api - 从 Web Api 2 中的 OData 客户端调用补丁的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com