2016-12-20 47 views
0

我有以下MVC控制器:MVC5控制器使用路由发现没有action属性

[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,我得到:

{ “消息”:“没有HTTP资源发现匹配的请求URI‘http://localhost/Perform/API/SystemCheck/EnvironmentValidate’。” “MessageDetail”:“没有行动上的发现与名称'EnvironmentValidate'匹配的控制器'SystemCheck'。“ }

它没有找到我的控制器操作,因为方法名称被称为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") } 
     ); 

我失去了我的任何想法?

感谢,

+0

我对MVC的路由不是很了解。但是如果我不得不猜测,我会说你的第一个选择不是因为你用“”设置了Route属性,而是因为“Get”在你的RouteConfig中被设置为默认值。另外,如果你想使用MVC控制器作为API,建议使用WebAPI代替(你可能有一个很好的理由不会,只是注意,如果你不知道) –

+0

我很确定何时在MVC中映射路由,它需要第一个匹配,在这种情况下应该是他的基于属性的路由。 –

+0

您可能正在混合使用MVC和WebApi组件。 ApiController是一个WebApi构造,您需要使用WebApi属性路由。每个名称空间都有完全相同的类定义,但它们不能相互工作。 https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Sunshine

回答

1

看起来你要使用MVC属性与控制器的WebAPI路由。

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

您可以切换到ApiControllerController,让你使用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属性的路由。