J'ai un projet Web API qui est utilisé depuis plusieurs années sans le support d'OData, avec des paramètres d'URL standard. Je souhaite maintenant ajouter le support OData à cette API, mais comme l'API n'est pas construite sur un modèle interrogeable, l'intention est de recevoir l'objet ODataQueryOptions<T>
et de le transmettre à un dépôt. Tout ce que je peux trouver à propos de la prise en charge d'OData suppose que j'ai un modèle interrogeable ou est trop simpliste et me dit simplement comment donner un sens à l'objet ODataQueryOptions
. Par conséquent, je suis incapable de mettre en place une méthode simple.Prise en charge d'ODataQueryOptions dans l'API Web existante
Voici ce que j'ai actuellement.
[Route("test")]
[HttpGet]
[EnableQuery]
public IHttpActionResult Test(ODataQueryOptions<TestOptions> options)
{
var settings = new ODataValidationSettings {
AllowedFunctions = AllowedFunctions.None,
AllowedLogicalOperators = AllowedLogicalOperators.Equal,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedQueryOptions = AllowedQueryOptions.Filter
};
try
{
options.Validate(settings);
}
catch (ODataException exception)
{
return BadRequest(exception.Message);
}
var binaryOperator = options.Filter?.FilterClause?.Expression as BinaryOperatorNode;
if (binaryOperator != null)
{
var property = binaryOperator.Left as SingleValuePropertyAccessNode ?? binaryOperator.Right as SingleValuePropertyAccessNode;
var constant = binaryOperator.Left as ConstantNode ?? binaryOperator.Right as ConstantNode;
if (property?.Property != null && constant?.Value != null)
{
;
}
}
return Ok();
}
La TestOptions
classe (dans le ODataQueryOptions<TestOptions>
param) est actuellement une classe vide:
public class TestOptions
{
}
J'ai aussi ajouté
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// existing code
config.AddODataQueryFilter();
}
}
Cependant, lors de l'appel de cette d'une API REST client ...
{
"Message": "Une erreur s'est produite",
"ExceptionMessage": "Aucune route HTTP non-OData enregistrée. »,
"ExceptionType": "System.InvalidOperationException",
"StackTrace": "..."
}
Qu'ai-je manqué je l'aurais pensé que je pourrais avoir à vous inscrire? OData-enabled méthodes dans le global.asax ou similaire, mais l'exception implique que le problème est avec des méthodes non-OData, mais toutes les autres méthodes retournent toujours comme prévu (soit, sans aucune participation OData)
Je pense que le message d'erreur est quelque peu trompeur ici et que vous devez enregistrer l'itinéraire OData. Suivez les instructions ici pour commencer: https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an -odata-v4-endpoint – TomDoesCode
Cet exemple est construit sur un modèle EF et comme je l'ai dit dans le PO, je n'ai pas de modèle sous-jacent. L'exemple enregistre le point de terminaison OData avec des détails spécifiques de son modèle: https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint # configure-the-odata-endpoint – awj
OK, vous avez quand même besoin de construire un modèle, même si ce n'est pas à travers le framework d'entité. Votre modèle sera-t-il défini au moment de la compilation? I.E les types et propriétés exposés seront-ils modifiés? – TomDoesCode