繁体   English   中英

HTTP 补丁 Delta 为 Null,带有 oData web 服务

[英]HTTP Patch Delta is Null with oData web service

我首先使用实体框架代码。 我的实体和 controller 是由 Visual Studio 生成的,没有被修改。

这个问题似乎是我的补丁请求的 DELTA 是 null。web 服务上的内部错误是“对象引用未设置为对象的实例”,这是在 Validate() function 上抛出的。

这是我的 web 服务 - 这是一个 PUT 服务,其行为类似于 PATCH。 这是为了解决 Agentry 框架的一个错误,该错误似乎不适用于 Patch。

// PUT: odata/Device(5)
    public IHttpActionResult Put([FromODataUri] long key, Delta<LineSeg> patch)
    {
        Validate(patch.GetEntity());

        if (!ModelState.IsValid)
        {
            return NotFound();
        }

        LineSeg LineSeg = db.LineSeg.Find(key);
        if (LineSeg == null)
        {
            return NotFound();
        }

        //note - put is acting as a patch due to agentry bug
        patch.Patch(LineSeg);

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!LineSegExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(LineSeg);
    }

这是我的要求:

Header:

Content-Type: application/atom+xml

身体:

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<content type="application/xml">
  <m:properties>
     <d:RESULTS_ID m:type="Edm.Int64">399</d:RESULTS_ID>
  </m:properties>

你想念[FromBody]

public IHttpActionResult Put([FromODataUri] long key, [FromBody] Delta<LineSeg> patch)
...

控制器对对象进行密封所需的

在我的案例中,问题是由 Nswag package 引起的。我必须完全摆脱它,问题才得以解决。 而且我还必须删除 [FromODataUri] 和 [FromBody]。 所以最终结果应该是:

public IHttpActionResult Put(long key, Delta<LineSeg> patch)

另请查看此处提供的示例: https://github.com/OData/AspNetCoreOData必须升级到最新的 nuget 包才能使用 odata 和其他包,示例才能正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM