我有以下MVC控制器:MVC5控制器使用路由发现没有action属性
[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,我得到:
{ “消息”:“没有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") }
);
我失去了我的任何想法?
感谢,
我对MVC的路由不是很了解。但是如果我不得不猜测,我会说你的第一个选择不是因为你用“”设置了Route属性,而是因为“Get”在你的RouteConfig中被设置为默认值。另外,如果你想使用MVC控制器作为API,建议使用WebAPI代替(你可能有一个很好的理由不会,只是注意,如果你不知道) –
我很确定何时在MVC中映射路由,它需要第一个匹配,在这种情况下应该是他的基于属性的路由。 –
您可能正在混合使用MVC和WebApi组件。 ApiController是一个WebApi构造,您需要使用WebApi属性路由。每个名称空间都有完全相同的类定义,但它们不能相互工作。 https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Sunshine