【问题标题】:Failed to serialize the response body after upgrading from ODATA v3 to v4从 ODATA v3 升级到 v4 后无法序列化响应正文
【发布时间】:2017-08-09 00:40:18
【问题描述】:

我有一个 Web API 服务器,我在其中使用 ODATA(和 EF 6)返回项目列表(由使用绑定到其 GridControl 的 DevExpress ODataInstantFeedbackSource 的 WinForms 客户端使用)。

这是返回 Items 列表的 Web API 控制器方法:

public IHttpActionResult GetItems(ODataQueryOptions<Item> queryOptions)
{
   var customerNumber = Request.Headers.GetValues("CustomerNumber").FirstOrDefault();
   try
   {
      queryOptions.Validate(_validationSettings);
      var query = queryOptions.ApplyTo(Context.Items) as IQueryable<Item>;
      var items = query.AsEnumerable().Select(i => new Item()
      {
         ItemNumber = i.ItemNumber,
         ItemDescription = i.ItemDescription,
         <snip>
         RebateAmount = RebateUtil.CalculateInstantRebates(i.ItemNo, customerNumber),
      }).AsQueryable();

      return Ok(items);
   }
   catch (ODataException ex)
   {
      return BadRequest(ex.Message);
   }
}

在我升级到 ODATA v3 之前,上述工作正常;升级后,我现在得到:

ObjectContent1 类型未能序列化响应正文 内容类型 "text/plain; charset=utf-8", type 的值 “System.Linq.EnumerableQuery1[[AcmeService.Model.Item, AcmeService.Model,版本=1.0.0.0,文化=中性, PublicKeyToken=null]]" 无法转换为原始字符串。

我在 HTTP 响应正文中看到了上述消息(状态 500)。请求网址为:http://acme.us/odata/Items/$count

请注意,如果我让 GetItems 控制器简单地执行“返回 Ok(Context.Items)”,它可以正常工作(没有错误,但我需要能够在返回数据之前设置 RebateAmount 值)。

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    我在另一个上下文中(没有 devexpress)有相同的错误消息,但也许这可以帮助你。 我通过替换这个命名空间解决了这个问题:

    using System.Web.Http.OData;
    

    作者:

    using System.Web.OData;
    

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多