使用oData Web服务,HTTP Patch Delta为空

时间:2017-03-28 15:04:37

标签: c# entity-framework web-services odata http-patch

我首先使用实体​​框架代码。我的实体和控制器是由Visual Studio生成的,尚未修改。

这个问题似乎是我的补丁请求的DELTA为空。 Web服务上的innererror是'对象引用未设置为对象的实例',它在Validate()函数上抛出。

这是我的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);
    }

这是我的要求:

部首:

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>

1 个答案:

答案 0 :(得分:1)

你错过了[FromBody]

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

控制器需要desealize对象