对于 WebAPI 路由,RouteData 必须包含 'action'?
RouteData must contain 'action' for an WebAPI route?
我正在尝试将 API 控制器添加到 MVC5 应用程序。但是,当我导航到路线时出现错误 "The RouteData must contain an item named 'action' with a non-empty string value.":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 }
);
}
}
尝试在 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
看看下面的教程
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 }
);
}
}
我正在尝试将 API 控制器添加到 MVC5 应用程序。但是,当我导航到路线时出现错误 "The RouteData must contain an item named 'action' with a non-empty string value.":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 }
);
}
}
尝试在 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
看看下面的教程
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 }
);
}
}