L’ajout d’un nouveau contrôleur OData fait échouer le contrôleur existant

Je construis un échantillon à partir de deux exemples Web API OData, chacun d’entre eux fonctionne bien en tant que projet séparé. Mais lorsque j’ajoute la deuxième classe ODataController, le site ne fonctionne plus et ne se plaint pas des modèles de chemin OData qui fonctionnaient auparavant. Voici plus de détails:

L’action suivante fonctionne correctement tant que son contrôleur (ProductsController) est le seul contrôleur:

[HttpGet] [ODataRoute("GetSalesTaxRate(state={state})")] public IHttpActionResult GetSalesTaxRate([FromODataUri] ssortingng state) { return Ok(GetRate(state)); } 

Maintenant, j’ajoute un nouveau contrôleur (MoviesController) avec quelques actions.

J’étends Owin Startup class pour qu’il ressemble à ceci:

 public void Configuration(IAppBuilder builder) { var config = new HttpConfiguration(); config.MapODataServiceRoute(routeName: "functions route", routePrefix: "functions", model: FunctionStartup.GetEdmModel()); config.MapODataServiceRoute(routeName: "actions route", routePrefix: "actions", model: ActionStartup.GetEdmModel()); builder.UseWebApi(config); } 

Cependant, lorsque j’essaie d’exécuter une requête Web (URLBASE / functions / $ metadata), le message d’erreur suivant s’affiche:

System.InvalidOperationExceptionLe modèle de chemin ‘GetSalesTaxRate (state = {state})’ de l’action ‘GetSalesTaxRate’ dans le contrôleur ‘Produits’ n’est pas un modèle de chemin d’access OData valide. Ressource non trouvée pour le segment ‘GetSalesTaxRate’.

Les contrôleurs sont mappés sur différentes routes (“fonctions” et “actions”). Peut-être que le problème est que chaque route est mappée à son propre EdmModel?

METTRE À JOUR. J’ai vérifié que je pouvais append plus de contrôleurs tant qu’ils se référaient au même modèle EDM. Mais une fois que j’ai introduit un deuxième modèle (et que je l’ai référencé à partir de MapODataServiceRoute), l’ensemble du service est interrompu. Existe-t-il une solution de contournement pour prendre en charge plusieurs modèles?

UPDATE 2. Si je sous-classe DefaultHttpControllerTypeResolver et n’active que le contrôleur unique (n’importe lequel d’entre eux), cela fonctionne également très bien. Mais je ne comprends toujours pas pourquoi plusieurs contrôleurs utilisant différents modèles échouent.

Par défaut, lorsque mappez les conventions de routage d’atsortingbut OData, la logique par défaut du sélecteur de contrôleur HTTP, IHttpControllerSelector, utilise le paramètre DefaultAssembloesResolver de HttpConfiguration, qui recherchera tous les types de contrôleurs d’un domaine d’application. La scope pourrait être réduite aux contrôleurs appartenant à un modèle.

Nous pouvons personnaliser les méthodes d’extension MapODataServiceRoute. Un extrait de code:

 public class Startup { public void Configuration(IAppBuilder builder) { var config = new HttpConfiguration(); config.CustomMapODataServiceRoute(routeName: "functions route", routePrefix: "functions", model: FunctionStartup.GetEdmModel(), controllers: new[] { typeof(ProductsController) }); config.CustomMapODataServiceRoute(routeName: "actions route", routePrefix: "actions", model: ActionStartup.GetEdmModel(), controllers: new[] { typeof(MoviesController) }); config.EnsureInitialized(); builder.UseWebApi(config); } } public class CustomAtsortingbuteRoutingConvention : AtsortingbuteRoutingConvention { private readonly List _controllers = new List { typeof(MetadataController) }; public CustomAtsortingbuteRoutingConvention(IEdmModel model, HttpConfiguration configuration, IEnumerable controllers) : base(model, configuration) { _controllers.AddRange(controllers); } public override bool ShouldMapController(HttpControllerDescriptor controller) { return _controllers.Contains(controller.ControllerType); } } public static class HttpConfigExt { public static ODataRoute CustomMapODataServiceRoute(this HttpConfiguration configuration, ssortingng routeName, ssortingng routePrefix, IEdmModel model, IEnumerable controllers) { var routingConventions = ODataRoutingConventions.CreateDefault(); routingConventions.Insert(0, new CustomAtsortingbuteRoutingConvention(model, configuration, controllers)); return configuration.MapODataServiceRoute(routeName, routePrefix, model, new DefaultODataPathHandler(), routingConventions); } }