【问题标题】:MVC5 Controller no action found using Route AttributeMVC5 控制器找不到使用路由属性的操作
【发布时间】: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();
    }

我希望能够通过以下两种方式访问​​它:

  1. http://localhost/Perform/API/SystemCheck/EnvironmentValidate
  2. 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


【解决方案1】:

您似乎正在尝试将 MVC 属性路由与 WebApi 控制器一起使用。

routes.MapMvcAttributeRoutes() 忽略了属性(因为它所期望的命名空间不匹配),所以只有 DefaultApiGet 路由被映射。

你可以将ApiController切换到Controller,这样你就可以使用MVC控制器,它匹配你正在使用的当前属性路由(假设你正在使用的Route属性在System.Web.Mvc命名空间中) .

或者您可以将命名空间更新为 System.Web.Http,这是 WebApi 命名空间,并改为调用 config.MapHttpAttributeRoutes()

更多说明在这里https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2设置WebApi属性路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2016-01-06
    • 2014-08-02
    • 2014-03-15
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多