J'ai suivi this tutoriel pour créer un service WebAPI REST.
Après cela, je pourrais charger la liste de tous les contacts en pointant sur http://baseaddress/api/Contacts
.
Ensuite, j'ai ajouté le code suivant dans la méthode Register
de WebApiConfig.cs afin d'activer un point de terminaison OData:
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Contact>("Contacts");
config.MapODataServiceRoute(
routeName: "OData",
routePrefix: "odata",
model: builder.GetEdmModel());
Et également ajouté le paramètre [EnableQuery]
sur la méthode Contact.GetContacts()
. De cette façon, je peux interroger des contacts particuliers comme celui-ci:
http://baseaddress/odata/Contacts?$filter=startswith(Name,'A')
et ça marche comme un charme.
Malheureusement, lorsque je mets le [EnableQuery]
, le noeud final WebAPI cesse de fonctionner et affiche à la place l'erreur suivante:
No non-OData HTTP route registered.
in System.Web.OData.Extensions.HttpConfigurationExtensions.GetNonODataRootContainer(HttpConfiguration configuration)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.GetRootContainer(HttpRequestMessage request, String routeName)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateRequestScope(HttpRequestMessage request, String routeName)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateRequestContainer(HttpRequestMessage request, String routeName)
...
Que dois-je faire pour résoudre ce problème?
J'ai rencontré ce problème et, puisque je travaille avec des injections de dépendance, j'ai réussi à le résoudre en ajoutant GlobalConfiguration.Configuration.EnableDependencyInjection()
à mon startup.cs
.
ex.
using System.Web.OData.Extensions;
public class Startup
{
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.EnableDependencyInjection();
}
}
Ajouter config.EnableDependencyInjection()
dans Startup.cs
a fonctionné pour moi.
var config = new HttpConfiguration();
config.EnableDependencyInjection();
J'ai rencontré ce problème auparavant et par l'ajout de la ligne ci-dessous cela a fonctionné pour moi
protected void Application_Start()
{
GlobalConfiguration.Configuration.EnableDependencyInjection();
.... }
J'ai eu cette erreur après avoir mis à jour les dépendances de mon projet WebApi (NuGet) sur:
Après avoir rétrogradé les versions que j'avais utilisées auparavant, l'erreur avait disparu:
Dans mon cas, j'ai eu l'erreur ci-dessus même si j'avais un projet séparé, qui n'avait aucun code Odata . C'était donc un message très étrange à recevoir.
Ma solution consistait à supprimer tous les paquets du dossier packages
. Après cela a fonctionné à nouveau. Certains paquets Odata étaient encore dans le dossier this.
Dans mon cas, j'avais un site Web avec des routes ODATA (et des contrôleurs) et d'autres routes d'API (et des contrôleurs). Ce qui s’est passé, c’est que mes autres routes étaient simplement en conflit avec celles d’ODATA, même avec des espaces de noms et des classes C # différents, etc.
Au début, mon contrôleur était comme ceci par exemple:
public class UserController : ApiController
{
[HttpPost]
public void Create([FromBody] string email)
{
}
}
J'ai également eu un itinéraire "utilisateur" dans ODATA quelque part (espace de noms différent, URL différentes, etc.). J'ai donc dû ajouter explicitement l'attribut Route, comme ceci:
public class UserController : ApiController
{
[HttpPost]
[Route("api/user/create")]
public void Create([FromBody] string email)
{
}
}
J'ai également eu cette erreur, et dans mon cas, c'était un problème de sensibilité à la casse. J'avais appelé
https://www.example.com/odata/MyEntities
au lieu de
https://www.example.com/odata/myentities
, tel qu'il a été enregistré.
Assurez-vous de vérifier la configuration de votre itinéraire et votre URL d’appel.