【问题标题】:Cannot serialize to Delta<> in an OData Controller无法在 OData 控制器中序列化为 Delta<>
【发布时间】:2014-09-01 10:41:21
【问题描述】:

我正在实施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&lt;&gt; 与 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&lt;BOOffer&gt; 更改为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));

【问题讨论】:

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


    【解决方案1】:

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

    System.Web.Http.OData.Formatter.ODataMediaTypeFormatter 未配置为能够序列化为 System.Web.OData.Delta&lt;T&gt;

    使用 System.Web.Http.OData.Delta&lt;T&gt; 按预期工作。

    注意在一个项目中引用不同的 OData 版本。

    【讨论】:

      猜你喜欢
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多