从ODATA v3升级到v4后无法序列化响应正文

时间:2017-03-17 12:37:42

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

我有一个Web API服务器,我使用ODATA(和EF 6)返回一个Items列表(由使用绑定到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”,类型的值   “System.Linq.EnumerableQuery1 [[AcmeService.Model.Item,   AcmeService.Model,Version = 1.0.0.0,Culture = neutral,   PublicKeyToken = null]]“无法转换为原始字符串。

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

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

using System.Web.Http.OData;

by:

using System.Web.OData;