2016-12-20 2 views
0

나는 다음과 같은 MVC 컨트롤러를 가지고 :MVC5 컨트롤러

나는이 두 가지 방법으로 액세스 할 수있게하려면
[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"로 지정되어 있기 때문에 내 컨트롤러 액션을 찾는 아닌가? 내가 부족 무엇

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") } 
     ); 

어떤 아이디어 : 여기

내가 내 RouteConfig.cs를 구성하는 방법입니다? 당신이 WebApi 컨트롤러와 라우팅 MVC 속성을 사용하려고하는 것 같습니다

+0

MVC 용 경로에 대한 지식이 많지 않습니다. 그러나 내가 추측해야만한다면 첫 번째 옵션은 Route 속성을 ""으로 설정했기 때문에가 아니라 RouteConfig에서 "Get"이 기본값으로 설정 되었기 때문에 작동하는 것입니다. 또한 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

감사합니다.

routes.MapMvcAttributeRoutes()은 (예상되는 네임 스페이스간에 불일치가 있기 때문에) 특성을 무시하므로 DefaultApiGet 경로 만 매핑됩니다.

당신은 당신이 사용하는 라우팅 현재 속성과 일치하는 MVC 컨트롤러를 사용하도록합니다 (RouteSystem.Web.Mvc 네임 스페이스에 사용하는 속성 가정), ControllerApiController을 전환 할 수 있습니다.

또는 네임 스페이스를 WebApi 네임 스페이스 인 System.Web.Http으로 업데이트하고 대신 config.MapHttpAttributeRoutes()을 호출 할 수 있습니다.

자세한 지침은 여기 https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 WebApi 속성 라우팅 설정을 참조하십시오.