1

Я пытаюсь добавить контроллер API в приложение MVC5. Однако я получаю сообщение об ошибке «RouteData должен содержать элемент с именем« действие »с непустым строковым значением». когда я перехожу на маршрут: http://localhost/DataAPI/Community/Get/RouteData должен содержать «действие» для маршрута WebAPI?

Приложение, похоже, не хочет распознавать контроллер API - если я добавлю действие к значениям по умолчанию для маршрута, я получаю ошибку 404. Когда я заменяю его стандартным контроллером (и добавляю действие по умолчанию к данным маршрута), я могу получить данные. Я что-то упускаю?

Контроллер живет в контроллерах/DataAPI подкаталог:

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); 
    } 
    } 
} 

Это мой маршрут конфигурации:

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

Вы немного настроены. Вы показываете конфигурацию своего маршрута для простого mvc, а не web api. – Nkosi

+0

Вы правы! Я подозревал, что это было что-то крошечное. Большое спасибо :) –

ответ

0

взглянуть на следующем уроке

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); 
    } 
    } 
} 

Вы отображаются настройки маршрута для MVC не веб-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

К сожалению, это лишь частичное исправление, так как неудобно, что маршрутизация WebAPI не поддерживает пространства имен. Ну, возможно, это происходит (через DataTokens), но в MVC5.2.3 DataTokens = null и не может быть инициализирован, поскольку он ReadOnly. Поэтому на данный момент я работаю над общим пространством имен контроллеров и создаю собственный маршрут для каждого контроллера API для маршрутизации запроса в CommunityApiController –

0

Попробуйте заменить маршрут RouteConfig следующим образом:

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

Кроме того, с помощью Web API вы не должны явно ссылаться на Get способ.

Так что в вашем случае вы можете передать идентификатор GUID в качестве параметра, например так: http://localhost/DataAPI/Community/6c4058a6-7edb-46c0-9d81-1c508c729f5b

Смежные вопросы