2016-10-31 2 views
0

RoutePrefix 속성으로 장식 된 세 개의 WebAPI 컨트롤러를 만들었습니다. 아래 그림과 같이 경로의 공유 부분이있다 :RoutePrefix 특성 하위 문자열이 중요한가?

다중 컨트롤러 유형이 URL을 일치 발견 :

[RoutePrefix("api/foo/users") 
public class ControllerOne : ApiController 
{ 
    ... 
} 

[RoutePrefix("api/foo/users/books") 
public class ControllerTwo : ApiController 
{ 
    ... 
} 

[RoutePrefix("api/foo/users/movies") 
public class ControllerThree : ApiController 
{ 
    [HttpGet] 
    [Route("")] 
    public void Foo(){} 
} 

내가 푸 방법 (주소 .../api/foo/users/movies/ 사용) 나는 다음과 같은 예외가 전화

. 여러 컨트롤러의 속성 경로가 요청한 URL과 일치하면 이 발생할 수 있습니다. 요청에서 일치하는 컨트롤러 유형은 다음과 같습니다. ... 예외.

RoutePrefix 속성 하위 문자열이 민감합니까?

+0

같은 컨트롤러 이름을 여러 번 사용하는 이유는 무엇입니까? – CodeNotFound

+1

@CodeNotFound 실례합니다. 제가 여기서 실수 한 세 명의 컨트롤러가 있습니다. – Landeeyo

+1

경로와 매개 변수에주의해야합니다. 예를 들어'api/foo/users' 경로가 매개 변수로 문자열을 기대한다면'api/foo/users','api/foo/users/movies'와'api/foo/users/books'가 둘 다 될 것입니다. 'api/foo/users/parameter'에 대한 유효한 호출과 웹 API는 어떤 경로로 귀하의 요청을 보낼지 알 수 없습니다. –

답변

1

web api에는 매개 변수의 유형을 알릴 수 있습니다. 예를 들어 :

[RoutePrefix("api/foo/users")] 
public class FirstControllerController : ApiController 
{ 
    [Route("{id:int}")] 
    public string Get(int id) 
    { 
     return "users ;)"; 
    } 
} 

[RoutePrefix("api/foo/users/movies")] 
public class SecondControllerController : ApiController 
{ 
    [Route("")] 
    // GET api/values/5 
    public string Get() 
    { 
     return "movies ;)"; 
    } 
} 

[Route("{id:int}")]를 사용하여, 그 경로는 정수를 보낼 경우에만 유효합니다. 그렇지 않은 경우 "무료 경로"로 사용할 수 있습니다. 그런 식으로, 당신이 할 경우 :

GET /api/foo/users/10

당신은 응답을 "users ;)"

를 얻을 수 있습니다 그리고 당신이 할 경우 :

GET /api/foo/users/movies

당신은 응답을 얻을 것이다 "movies ;)"

내 생각에 {id:int}을 사용하면 문제! 하지만 항상 경로를 만들 때주의하십시오! ;)

0

RoutePrefix은 서브 문자열에 민감하지 않습니다. 그러나 인 정수인 경우에도 주소의 수정 후 변수는 예외입니다. Bar있어서 상기 코드의

[RoutePrefix("api/foo/users") public class ControllerOne : ApiController { [HttpGet] [Route("{someVariable}")] public string Bar(int someVariable){return "FooBar";} } [RoutePrefix("api/foo/users/movies") public class ControllerThree : ApiController { [HttpGet] [Route("")] public void Foo(){} } 

ControllerThreeRoutePrefix 방해한다.

+0

매개 변수의 유형을 제한 할 수 있습니다. ;) –

관련 문제