【发布时间】:2016-12-20 18:48:23
【问题描述】:
我有以下 MVC 控制器:
[RoutePrefix("api/SystemCheck")]
public class SystemCheckController : ApiController
{
[HttpGet]
[Route("")]
[Route("EnvironmentValidate")]
[RequiresPrivilegeMVC((int)PrivilegeType.SystemCheck)]
public IEnumerable<EnvironmentValidation> Get()
{
return FilteredEnvironmentValidate();
}
我希望能够通过以下两种方式访问它:
- http://localhost/Perform/API/SystemCheck/EnvironmentValidate
- http://localhost/Perform/API/SystemCheck/
当我尝试选项 2 时,我得到了有效的响应。但是,当我尝试选项 1 时,我得到:
{ "Message": "没有找到与请求 URI 'http://localhost/Perform/API/SystemCheck/EnvironmentValidate' 匹配的 HTTP 资源。", “MessageDetail”:“在控制器 'SystemCheck' 上找不到与名称 'EnvironmentValidate' 匹配的操作。” }
它没有找到我的控制器操作,因为方法名称被称为Get,但路由将其指定为“EnvironmentValidate”?
这是我配置 RouteConfig.cs 的方式:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapHttpRoute(
name: "DefaultApiGet",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Get" },
constraints: new { httpMethod = new HttpMethodConstraint("GET") }
);
关于我缺少什么的任何想法?
谢谢,
【问题讨论】:
-
我不是 MVC 路由的超级知识。但是,如果我不得不猜测一下,我会说您的第一个选项有效,不是因为您使用“”在其上设置了 Route 属性,而是因为“Get”在您的 RouteConfig 中设置为默认值。此外,如果您想将 MVC 控制器用作 API,建议改用 WebAPI(您可能有充分的理由不这样做,只是注意以防万一您不知道)
-
我很确定在 MVC 中映射路由时,它需要第一个匹配项,在这种情况下应该是他的基于属性的路由。
-
您可能正在混合使用 MVC 和 WebApi 组件。 ApiController 是一个 WebApi 构造,您需要使用 WebApi 属性路由。每个命名空间都定义了完全相同的类,但它们不能相互工作。 asp.net/web-api/overview/web-api-routing-and-actions/…
标签: c# asp.net-mvc asp.net-mvc-5