无法序列化为Delta<>在OData控制器中

时间:2014-09-01 10:41:21

标签: odata breeze asp.net-web-api2 http-patch

我正在实施ODataController。出于与Breeze.js的兼容性原因,它是OData V3:

using System.Web.Http.OData;
public class OffersController : ODataMetadataController
{
    ...

在中间我想要实现合并/补丁,如示例所示:

[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta)
{
    ...

出于某种原因,我收到以下错误:

  

没有MediaTypeFormatter可用于从媒体类型为'application / json'的内容中读取“Delta`1”类型的对象。;

确定。 Delta<>与OData相关,我需要一个OData格式化程序。

迭代格式化程序(as on this page),它似乎不是OData格式化程序:

JsonMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: BaseJsonMediaTypeFormatter
    Media Types: application/json, text/json
XmlMediaTypeFormatter
    CanReadType: True
    CanWriteType: True
    Base: MediaTypeFormatter
    Media Types: application/xml, text/xml
FormUrlEncodedMediaTypeFormatter
    CanReadType: False
    CanWriteType: False
    Base: MediaTypeFormatter
    Media Types: application/x-www-form-urlencoded
JQueryMvcFormUrlEncodedFormatter
    CanReadType: True
    CanWriteType: False
    Base: FormUrlEncodedMediaTypeFormatter
    Media Types: application/x-www-form-urlencoded

我应该注册这个格式化程序吗?不应该是自动的吗?如果我需要手动注册,怎么做?

如果我将输入参数从Delta<BOOffer>更改为BOOffer,则会调用该方法,但由于只发送了已更改的属性,因此我无法使用。

我在app_start中配置我的控制器,如下所示:

System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3 = new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3 = builderV3.EntitySet<BOOffer>("Offers");
entitySetConfigV3.EntityType.HasKey(o => o.ID);

config.Routes.MapODataServiceRoute(
    routeName: "odata/v3", 
    routePrefix: "odata/v3",
    model: builderV3.GetEdmModel(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

1 个答案:

答案 0 :(得分:1)

原因是在项目中引用System.Web.Http.OData(odatav3)和System.Web.OData(odatav4)并混合引用。

System.Web.Http.OData.Formatter.ODataMediaTypeFormatter未配置为能够序列化为System.Web.OData.Delta<T>

使用System.Web.Http.OData.Delta<T>按预期工作。

在一个项目中引用不同的OData版本时要小心。