【问题标题】:How to use Delta<T> from Microsoft ASP.NET Web API OData with Code First\JsonMediaTypeFormatter如何使用 Microsoft ASP.NET Web API OData 中的 Delta<T> 和 Code First\JsonMediaTypeFormatter
【发布时间】:2019-08-14 03:27:14
【问题描述】:

有什么问题?

我正在尝试在我的 ASP.net Web api 应用程序中启用补丁。我正在使用代码优先实体框架。

我有以下方法头,我可以在其中设置断点,它会命中:

[AcceptVerbs("PATCH")]
public async Task<HttpResponseMessage> Patch(long appId, long id, Delta<SimpleFormGroup> formGroup)

但是,当我调用 formGroup.Patch(entity) 时,我的实体没有任何更改。如果我将以下内容放入即时窗口:

formGroup.GetChangedPropertyNames()

那么这个集合是空的,好像不对。

我尝试了什么?

我一直在参考下面的例子

http://techbrij.com/http-patch-request-asp-net-webapi http://www.strathweb.com/2013/01/easy-asp-net-web-api-resource-updates-with-delta/

这似乎是 Json MediaType Formatter 不知道如何正确构建 Delta 对象的问题,但是在第二个链接中 filip 似乎确实表明它应该在没有 oDataMediaTypeFormatter 的情况下工作。

我已经开始尝试将我的模型序列化为 EDMX 表示,然后从那里提取 CSDL,以便我可以创建一个 oDataMediaTypeFormatter,但我也遇到了障碍,而且这似乎有点矫枉过正。

如果有人能对此有所了解,将不胜感激。如果需要更多信息,请告诉我。

编辑:

这是 SimpleFormGroup 的类定义:

public class SimpleFormGroup
{
    public int LastUpdate;

    public string Identifier;

    public string Title;

    public int DisplayOrder;
}

这是我要发送的数据:

Content-Type: 'application/json'

{ "DisplayOrder" : "20 }

【问题讨论】:

  • 您能否添加 SimpleFormGroup 的类定义以及您在 PATCH 的请求中发送的 JSON?
  • 见上文...我实际上已经找到了解决此问题的方法,但我也很想听听您的想法
  • 考虑到 20 左侧的引号,这不是有效的 JSON。值周围是否有结束引号或没有开始引号?
  • 我想知道 webapi 1 和 webapi 2 之间发生了什么变化。Delta 过去在 WebAPI 1 中使用 Filip 的 Delta 代码与 JSON.NET 一起工作得很好

标签: c# rest asp.net-web-api odata


【解决方案1】:

有趣的是,带有 int 成员的 Delta&lt;T&gt; 在 JSON 中似乎不起作用。

很遗憾,Delta&lt;T&gt; 是专门为 OData 创建的。如果Delta&lt;T&gt; 似乎正在使用除 OData 之外的任何格式化程序,那是巧合,而不是故意的。

不过,好消息是,没有什么能阻止您为 JSON 定义自己的 PATCH 格式,如果没有人已经编写过更适合 Json.NET 的格式,我会感到惊讶。我们可能会在未来的 Web API 版本中重新审视补丁,并尝试提出一个适用于各种格式化程序的一致故事。

【讨论】:

  • 拥有可支持的 Delta 不仅可用于 OData,而且通常可用于 Web API,这将是非常有益的。每次我创建一个依赖于提交者的离散知识来执行部分更新的 Patch() 操作时,我都会感到难过 :( 是否有关于 codeplex 的问题,我们可以投票以帮助使需求合法化?
  • 我注意到它在 JSON 的 intGuid 上阻塞。我在这里发布了一个解决方法strathweb.com/2013/01/…。简而言之,JSON.NET 会将 int 视为 long 并将 Guid 视为字符串,因此 Delta 代码需要对此进行屏蔽,
  • 我希望他们不要再在aspnetwebstack.codeplex.com/workitem/777 上胡言乱语了。这对一般的 mvc / web api 非常有用。
  • 有没有人让它与 json.net 和 webapi2 一起工作?我在 WebAPI 1 项目中使用了 filipw 的 Delta 代码,它适用于 json.net 4.5.11
【解决方案2】:

感谢 Youssef 调查和发现问题所在的原因。希望这可以得到解决。

在仔细研究了 oData 包源之后,我最终自己破解了这个问题。我选择实现另一个包含逻辑的 MediaTypeFormatter,因为它提供了对 HttpContent 的轻松访问,但还有其他方法可以实现这一点。

关键部分是弄清楚如何解释代码优先模型,请参见下面的注释行:

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
    var builder = new ODataConventionModelBuilder();

    // This line will allow you to interpret all the metadata from your code first model
    builder.EntitySet<EfContext>("EfContext");

    var model = builder.GetEdmModel();
    var odataFormatters = ODataMediaTypeFormatters.Create(model);
    var delta = content.ReadAsAsync(type, odataFormatters).Result; 

    var tcs = new TaskCompletionSource<object>(); 
    tcs.SetResult(delta); 
    return tcs.Task; 
}

希望这可以为某人省去一些麻烦!

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2012-10-28
    • 2017-10-02
    • 1970-01-01
    • 2016-03-17
    • 2013-03-07
    • 2013-08-04
    • 2013-11-27
    相关资源
    最近更新 更多