1

Ich versuche, einen API-Controller zu einer MVC5-Anwendung hinzuzufügen. Allerdings bekomme ich einen Fehler "Die RouteData muss ein Element mit dem Namen 'Aktion' mit einem nicht leeren String-Wert enthalten." Wenn ich zur Route gehe: http://localhost/DataAPI/Community/Get/RouteData muss 'Aktion' für eine WebAPI-Route enthalten?

Die Anwendung scheint einen API-Controller nicht zu erkennen - wenn ich die Aktion zu den Routenvorgaben hinzufüge, erhalte ich einen 404-Fehler. Wenn ich es durch einen Standard-Controller ersetze (und den Routendaten eine Standardaktion hinzufüge), kann ich die Daten abrufen. Fehle ich etwas?

Die Steuerung lebt in den Controller/DataAPI Unterverzeichnis:

using System.Web.Http; 
using System.Net.Http; 

namespace ERP.Controllers.DataAPI 
{ 
    public class CommunityController : ApiController 
    { 
    PCSEntities db = new PCSEntities(); 

    public IEnumerable<Community> Get(Guid ApiKey) 
    { 
     return db.Communities.AsNoTracking().Take(10); 
    } 
    } 
} 

Das ist mein Weg config:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     #region DataAPI 

     var ns = new[] { "ERP.Controllers.DataAPI" }; 
     routes.MapRoute(
      name: "DataAPI", 
      url: "DataAPI/{controller}/{ApiKey}/{id}", 
      defaults: new { ApiKey = Guid.Empty, id = UrlParameter.Optional }, 
      namespaces: ns 
     ); 
     #endregion 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 
+0

Ihre Konfiguration ist ein wenig aus. Sie zeigen Ihre Route-Konfiguration für einfache mvc nicht Web-API. – Nkosi

+0

Sie haben Recht! Ich vermutete, dass es so winzig war. Vielen Dank :) –

Antwort

0

Werfen Sie einen Blick auf den folgenden Tutorial

Routing in ASP.NET Web API

using System.Web.Http; 
using System.Net.Http; 

namespace ERP.Controllers.DataAPI 
{ 
    public class CommunityController : ApiController 
    { 
    PCSEntities db = new PCSEntities(); 

    public IEnumerable<Community> GetCommunities(Guid ApiKey) 
    { 
     return db.Communities.AsNoTracking().Take(10); 
    } 
    } 
} 

Sie angezeigte Route Konfiguration für MVC nicht web Api

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 

     #region DataAPI 

     var ns = new[] { "ERP.Controllers.DataAPI" }; 
     config.Routes.MapHttpRoute(
      name: "DataAPI", 
      routeTemplate: "DataAPI/Community/{ApiKey}", 
      defaults: new {controller= "Commmunity", action = "GetCommunities", ApiKey = Guid.Empty}, 
      namespaces: ns 
     ); 
     #endregion 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
+0

Leider ist es nur eine teilweise Lösung, wie frustrierend WebAPI Routing Namespaces nicht unterstützt. Nun, angeblich (via DataTokens), aber in MVC5.2.3 DataTokens = null, und kann nicht initialisiert werden, wie es ReadOnly ist. Im Moment arbeite ich vom generischen Controller-Namespace ab und erstelle eine benutzerdefinierte Route pro API-Controller, um die Anfrage an den CommunityApiController weiterzuleiten –

0

Versuchen Sie, Ihren Weg in RouteConfig wie folgt zu ersetzen:

routes.MapHttpRoute(
    name: "DataAPI", 
    routeTemplate: "DataAPI/{controller}/{ApiKey}/{id}", 
    defaults: new { ApiKey = Guid.Empty, id = UrlParameter.Optional } 
); 

Außerdem sollten Sie mit der Web-API nicht explizitaufrufenMethode.

Also in Ihrem Fall können Sie GUID als Parameter wie folgt übergeben: http://localhost/DataAPI/Community/6c4058a6-7edb-46c0-9d81-1c508c729f5b