RouteData должен содержать «действие» для маршрута WebAPI?

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

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

Контроллер находится в подкаталоге Controllers/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 }
        );
    }
}

person Katya S    schedule 25.03.2016    source источник
comment
Ваша конфигурация немного неверна. Вы показываете конфигурацию маршрута для простого mvc, а не для веб-API.   -  person Nkosi    schedule 25.03.2016
comment
Ты прав! Я подозревал, что это что-то маленькое вроде этого. Большое спасибо :)   -  person Katya S    schedule 26.03.2016


Ответы (2)


Взгляните на следующий учебник

Маршрутизация в ASP Веб-API .NET

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 }
        );
    }
}
person Nkosi    schedule 25.03.2016
comment
К сожалению, это лишь частичное исправление, так как, к сожалению, маршрутизация WebAPI не поддерживает пространства имен. Ну, предположительно, это так (через DataTokens), но в MVC5.2.3 DataTokens = null и не может быть инициализирован, поскольку он доступен только для чтения. Итак, на данный момент я работаю с общим пространством имен контроллера и создаю собственный маршрут для каждого контроллера API, чтобы направить запрос в CommunityApiController. - person Katya S; 26.03.2016

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

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

Кроме того, при использовании веб-API не следует явно вызывать метод Get.

Таким образом, в вашем случае вы можете передать GUID в качестве параметра следующим образом: DataAPI/Сообщество/6c4058a6-7edb-46c0-9d81-1c508c729f5b

person Alex P    schedule 25.03.2016