JSON.NET en tant que sérialiseur WebAPI 2 OData par rapport à ODataMediaTypeFormatter

Je suis en train d'utiliser JSON.NET en tant que par défaut sérialiseur WebAPI 2 de la pile. J'ai mis en place JsonMediaTypeFormatter, dans laquelle j'ai utilisé JSON.NET sérialiseur pour sérialiser/désérialiser des données et créé JsonContentNegotiator pour l'utilisation de ce type de média formateur. Tout fonctionne bien sauf OData demander si j'ajoute [Queryable] les métadonnées ot méthode d'action, puis la réponse de l'objet ne contient toute l'information sur les métadonnées, seule la liste des entités.

Petit exemple. Ma méthode d'action:

[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());
}

Si j'utilise par défaut OData sérialiser et appeler quelques-requête par type de Règle (par exemple, la .../odata/RuleType?$inlinecount=allpages&$skip=0&$top=1), je reçois classic réponse OData avec les métadonnées de l'info et de la propriété count:

odata.metadata ".../odata/$metadata#RuleType" 
odata.count    "2" 
value
        0    {
                 Id: 1
             Name: "General"
             Code: "General"
             Notes: null
             }

(certains champs sauté, mais j'ai des Notes de la propriété avec la valeur null)
Mais si j'ajoute mon JsonContentNegotiator avec JsonMediaTypeFormatter comme un sérialiseur - je recevoir uniquement la liste des entités:

[
  {
    "Id": 1,
    "Name": "General",
    "Code": "General"
  }
]

(pas de Notes de terrain ici à cause de NullValueHandling.Ignore)
Encore plus. Si je supprime [Queryable] attribut de méthode d'action - je recevoir un autre résultat:

{
  "Items": [
    {
      "Id": 1,
      "Name": "General",
      "Code": "General"
    }
  ],
  "Count": 2
}

Dans ce cas, j'ai reçu le Comte, mais toujours pas de métadonnées ici. Et aussi odata réponse noms de propriété est totalement différente de défaut.

Mon esprit est soufflé vers le haut. Je veux juste utiliser JSON.NET comme mon sérialiseur dans n'importe quelle partie de mon application web (en raison de fortes restrictions). Comment puis-je faire cela?

source d'informationauteur Dmytro Rudenko