Ich folgte dem Tutorial " this ", um einen WebAPI-Dienst REST zu erstellen.
Danach konnte ich die Liste aller Kontakte laden, indem Sie auf http://baseaddress/api/Contacts
zeigen.
Dann habe ich in der Register
-Methode in WebApiConfig.cs den folgenden Code hinzugefügt, um einen OData-Endpunkt zu aktivieren:
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());
Und fügte auch den [EnableQuery]
-Parameter zur Contact.GetContacts()
-Methode hinzu. Auf diese Weise kann ich bestimmte Kontakte wie folgt abfragen:
http://baseaddress/odata/Contacts?$filter=startswith(Name,'A')
und es funktioniert wie charmant.
Wenn ich den [EnableQuery]
setze, funktioniert der WebAPI-Endpunkt leider nicht mehr und zeigt stattdessen den folgenden Fehler an:
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)
...
Was muss ich tun, um das Problem zu beheben?
Ich bin auf dieses Problem gestoßen und da ich mit Abhängigkeitsinjektionen arbeite, konnte ich dieses Problem lösen, indem ich GlobalConfiguration.Configuration.EnableDependencyInjection()
meinem startup.cs
ex.
using System.Web.OData.Extensions;
public class Startup
{
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.EnableDependencyInjection();
}
}
Das Hinzufügen von config.EnableDependencyInjection()
in Startup.cs
hat für mich funktioniert.
var config = new HttpConfiguration();
config.EnableDependencyInjection();
Ich bin auf dieses Problem vor und durch das Hinzufügen der Zeile darunter gestoßen, hat es für mich funktioniert
protected void Application_Start()
{
GlobalConfiguration.Configuration.EnableDependencyInjection();
.... }
Ich habe diese Fehlermeldung erhalten, nachdem ich meine WebApi-Projektabhängigkeiten (NuGet) aktualisiert hatte:
Nach dem Downgrade auf die zuvor verwendeten Versionen war der Fehler wieder verschwunden:
In meinem Fall habe ich den obigen Fehler erhalten, obwohl ich ein separates Projekt hatte, das überhaupt keinen Odata-Code hatte . Das war also eine sehr seltsame Nachricht.
Meine Lösung war, lösche alle Pakete aus dem Ordner packages
Danach hat es wieder geklappt. Einige Odata-Pakete befanden sich noch in diesem Ordner.
In meinem Fall hatte ich eine Website mit ODATA-Routen (und -Controllern) und anderen API-Routen (und -Controllern). Was geschah, war, dass meine anderen Routen nur mit ODATA-Routen in Konflikt standen, selbst mit unterschiedlichen C # -Namensräumen und -Klassen usw.
Anfangs war mein Controller zum Beispiel so:
public class UserController : ApiController
{
[HttpPost]
public void Create([FromBody] string email)
{
}
}
Ich hatte auch eine "User" -Route in ODATA (anderer Namespace, andere URLs usw.). Also musste ich explizit das Route-Attribut hinzufügen, wie folgt:
public class UserController : ApiController
{
[HttpPost]
[Route("api/user/create")]
public void Create([FromBody] string email)
{
}
}
Ich habe auch diesen Fehler erhalten, und in meinem Fall war dies ein Problem mit der Groß- und Kleinschreibung. Ich hatte angerufen
https://www.example.com/odata/MyEntities
statt
https://www.example.com/odata/myentities
, wie es registriert wurde.
Überprüfen Sie unbedingt Ihre Routenkonfiguration und die aufrufende URL.