2017-03-24 4 views
0

웹API의 일부로 2 개의 라우트가 있습니다. 이들은 동일한 매개 변수를 허용하지만 라우트에는 다른 정적 구성 요소가 있습니다. 그러나 그들은 요청하는 동안 둘 다 호출됩니다.WebAPI, 다중 라우트가 호출되고 있습니다.

[HttpGet] 
[Route("things/{id}/config/{optional?}")] 
public dynamic ThingsConfig(int id, int optional = 0) 
{ 
    // stuff happens 
} 

그리고

[HttpGet] 
[Route("things/{id}/data/{optional?}")] 
public dynamic ThingsData(int id, int optional = 0) 
{ 
    // stuff happens 
} 

난 다음에서 [경로] 줄을 주석 경우 Global.asax에 나의 경로 설정은 상자 버전

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { action = "get", id = RouteParameter.Optional } 
    ); 

의 외부에서 변경되지 않습니다 API는 예상대로 404 오류를 반환합니다. 그러나 하나 개의 경로가 다음에 액세스 할 때이있을 때 둘 다 예를 들면 다음과 같습니다

http://localhost/api/things/1/config/ 

는 ThingsConfig 및

ThingsData

모두 내가 잘못 여기에 무슨 짓을 호출 할 것인가?

업데이트 :

나는이 문제를 단순화하려고 노력했다.

새로운 VS 2015 솔루션을 만듭니다. 파일 -> 새로 만들기 -> 웹

선택 "웹 API"

-> 프로젝트

확인 .NET 프레임 워크 4.5 "ASP.NET 웹 응용 프로그램 (.NET 프레임 워크)"C 번호에 따라 선택 를 선택 이 자체 -

추가 RoutePrefix 컨트롤러 자체에 :

"변경 인증" "어떤 인증"

는 값 컨트롤러를 다음과 같이 변경 제작 (것들을 조금 단순화 없습니다)하기 필요하다. 내 두 개의 테스트 경로를 추가 - 그래서 컨트롤러의 머리는 이제 다음과 같습니다

[RoutePrefix("api/values")] 
public class ValuesController : ApiController 
{ 
    [HttpGet] 
    [Route("things/{id}/config/{optional?}")] 
    public dynamic ThingsConfig(int id, int optional = 0) 
    { 
     return "Config"; 
    } 

    [HttpGet] 
    [Route("things/{id}/data/{optional?}")] 
    public dynamic ThingsData(int id, int optional = 0) 
    { 
     return "Data"; 
    } 

다른 변화가 기본 프레임 워크로 제작되지 않았다.

http://localhost:<port>/api/values/things/1/config 
http://localhost:<port>/api/values/things/1/data 

내가 기대 한 것처럼이 작동 :

그런 다음 두 개의 경로를했다. 각 경로를 개별적으로 호출 할 수 있습니다.

하지만 원래의 솔루션은 여전히 ​​두 경로 모두를 호출 할 수 있습니다. 누구나 내가 이것을 허용 할 수있는 부분을 바꿀 수 있다고 제안 할 수 있습니까?

+0

이 솔루션과 원래 솔루션의 차이점은 무엇입니까? 나는 둘 다 같다고 생각합니다. –

+0

에티켓이 무엇인지 확실하지 않습니다. 문제는 클라이언트가 호출 한 API와 관련이 없습니다. 둘 다 실제로 부름을 받았다. 방금 질문에 대답해야합니까 아니면 비 문제였던 그대로 삭제해야합니까? 사람들이 도우려고 노력하면서 그것이 사라지 길 바라지 마십시오. – Morvael

+0

Bdw에 "routes.MapMvcAttributeRoutes();"가 추가되었습니다. route.MapRoute (...) 메소드 앞에있는 RouteConfig의이 라인? Plz이 추가하고 한 번 확인하고 알려주세요. –

답변

0

문제는 클라이언트에서 발생한 것으로 밝혀졌습니다. 실제로 두 경로를 호출하고있었습니다. Fiddler로 원시 API를 테스트 한 결과 문제가 표시되지 않았습니다.

"키보드와 의자 사이의 문제"에서이 파일을 제출하십시오.

1

당신은 api 컨트롤러를 만들고 컨트롤러 경로 등록을보고 있다고 생각해보십시오.

프로젝트에서 webapi를 참조하려면 아래 단계를 따라야합니다.

그러나 중복으로 인해 구현에 오류가 발생합니다.

요청과 일치하는 여러 작업이 발견되었습니다. 유형 FailTracker.Controllers.ThingsController의 ThingsConfig FailTracker.Controllers 유형의 ThingsData.ThingsController

관련 문제