【问题标题】:RouteData must contain 'action' for an WebAPI route?RouteData 必须包含 WebAPI 路由的“操作”?
【发布时间】:2016-07-13 09:46:52
【问题描述】:

我正在尝试将 API 控制器添加到 MVC5 应用程序。但是我收到一个错误“RouteData 必须包含一个名为 'action' 且具有非空字符串值的项目。”当我导航到路线时: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 }
        );
    }
}

【问题讨论】:

  • 你的配置有点不对劲。您正在显示普通 mvc 而不是 web api 的路由配置。
  • 你是对的!我怀疑它是像这样的小东西。非常感谢:)

标签: c# asp.net-web-api asp.net-mvc-5 asp.net-web-api-routing


【解决方案1】:

看看下面的教程

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

【讨论】:

  • 不幸的是,这只是部分修复,令人沮丧的是,WebAPI 路由不支持命名空间。好吧,据说它确实(通过 DataTokens)但是在 MVC5.2.3 DataTokens = null 中,并且不能初始化,因为它是只读的。所以目前我正在处理通用控制器命名空间并为每个 API 控制器创建一个自定义路由以将请求路由到 CommunityApiController
【解决方案2】:

尝试在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2019-11-22
    • 1970-01-01
    • 2016-01-20
    • 2020-03-16
    相关资源
    最近更新 更多