小编Dmy*_*nko的帖子

JSON.NET作为WebAPI 2 OData序列化程序与ODataMediaTypeFormatter

我正在尝试将JSON.NET用作WebAPI 2堆栈中的默认序列化程序.我已经实现了JsonMediaTypeFormatter,其中我使用了JSON.NET序列化程序来序列化/反序列化数据,并创建了JsonContentNegotiator来使用这种媒体类型格式化程序.除OData查询外所有工作正常 - 如果我添加[可查询]元数据ot动作方法,则响应对象不包含任何元数据信息,仅包含实体列表.

小例子.我的行动方法:

[Queryable]
public async Task<PageResult<RuleType>> GetRuleType(ODataQueryOptions<RuleType> options)
{
    var ret = await _service.ListRuleTypesAsync(options);
    return new PageResult<RuleType>(
        ret,
        Request.GetNextPageLink(),
        Request.GetInlineCount());
}
Run Code Online (Sandbox Code Playgroud)

如果我使用默认的OData序列化并按规则类型调用一些查询(例如 - .../odata/RuleType?$inlinecount=allpages&$skip=0&$top=1),我会收到带有元数据信息和计数属性的经典OData响应:

odata.metadata ".../odata/$metadata#RuleType" 
odata.count    "2" 
value
        0    {
                 Id: 1
             Name: "General"
             Code: "General"
             Notes: null
             }
Run Code Online (Sandbox Code Playgroud)

(某些领域跳过,但我有一个空值Notes属性),但如果我加上我JsonContentNegotiatorJsonMediaTypeFormatter一个串行-我只接收实体的名单:

[
  {
    "Id": 1,
    "Name": "General",
    "Code": "General"
  }
]
Run Code Online (Sandbox Code Playgroud)

(因为这里没有Notes字段NullValueHandling.Ignore)更多.如果我[Queryable]在动作方法中删除属性 - 我收到另一个结果:

{
  "Items": [
    {
      "Id": 1,
      "Name": "General",
      "Code": "General"
    }
  ],
  "Count": 2 …
Run Code Online (Sandbox Code Playgroud)

serialization json.net asp.net-web-api

18
推荐指数
2
解决办法
1万
查看次数

作为Func <>的结果的任务<IList <>>

我试图通过一些额外的计算来调用我的异步方法的wrap方法:

private async Task<IEnumerable<Dictionary<string, object>>> Execute(Func<Task<IList<Dictionary<string, object>>>> func)
{
  var ret = await func();
  // Skipped
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

它适用于某些情况:

var data = await Execute(() => chain.Start(parameters), args);
Run Code Online (Sandbox Code Playgroud)

chain.Start是哪里的

async Task<IList<Dictionary<string, object>>> Start(Dictionary<string, object> parameters)
Run Code Online (Sandbox Code Playgroud)

但在某些情况下我的func是不可接受的,所以我试图在其中返回Task.FromResult.

var ret = Execute(() => Task.FormResult(new List<Dictionary<string, object>>());
Run Code Online (Sandbox Code Playgroud)

和compilator说,那

错误24无法转换lambda表达式的委托类型"System.Func >>>",因为一些块的返回类型不隐式转换为委托返回类型

这种情况下可以使用等待吗?或者我应该以同步方式重写我的代码?

c# generics task-parallel-library

2
推荐指数
1
解决办法
2418
查看次数