2017-01-10 2 views
1

Visual Studio에서 WebAPI 2와 EF 및 스캐 폴딩 webapi 컨트롤러를 사용하고 있습니다. 각 컨트롤러는 4 개의 기본 동사 (GET, PUT, DELETE, POST)와 5 개의 동작으로 생성됩니다. GET 조치에는 두 가지 버전이 있습니다. // 기본WebAPI 2 : 기본 GET ALL이 잘못된 매개 변수로 호출되었습니다.

  1. IQueryable<entity> GetEntities()
  2. Task<IHttpActionResult> GetEntity(GUID key)은 INT ID입니다하지만 난 GUID로 변경되었습니다.

컨트롤러의 속성 라우팅 및 경로 접두사를 사용하고 있습니다. url의 더 나은 관리를위한 다만 몇몇 공상 키워드. [RoutePrefix("api/v3/Company")]

문제 :

가 잘못된 매개 변수를 URL에 전송 이상적 때, 그것은 오류를 반환해야하지만, 오류를 제기하지 않는 내가 잘못 GUID 보낼 경우 대신이 parameter.while없이 행동으로 폴백 , 그것은 오류를 보여줍니다.

체감 나는 호출하는 경우 : http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2

는 올바른 결과를 보여줍니다.

내가 전화 할 때 : http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e96500 (잘못된 키) 내가 전화

가 다시 GetEntity() 기능 설정을 보여줍니다 모든 레코드

: http://localhost:8080/api/v3/Company/1 (안 GUID 길이 매개 변수)

을 동일하게하고 모든 기록을 보여줍니다.

나는이에 대한 몇 가지 지침을 얻을 수 있다면 정말 감사 속성 [Route("{id:guid}")]

를 사용하고 있습니다!

+0

에서 활성화되어 있는지 확인 GET있어 기본 경로가 알려 행동에 경로 특성을 적용 명시 적으로 만들 필요가 그리고'IQueryable GetEntities()'에 어떤 경로가 있습니까? – Nkosi

+0

@Nkosi Out of box, 기본 동작에 지정된 경로가 없습니다. api/v3/Company를 호출하면 GetEntities()가 호출됩니다. 하지만 GetEntity (int id)에 대한 기본 매개 변수를 GetEntity (Guid id)로 변경했기 때문에이 매개 변수를 명시 적으로 지정해야합니다. 이상한 이유로 "id"매개 변수 이외의 값을 선택하지 않습니다 (int가 아닌 경우 이유는 모르겠다.) – Shahzad

답변

1

경로가 협약 기반 매핑으로 다시 기본 설정되어있을 가능성이 높습니다. 당신은 라우팅이

[RoutePrefix("api/v3/Company")] 
public class CompanyController : ApiController { 

    //GET api/v3/Company 
    [HttpGet] 
    [Route("")] //Default Get 
    public IQueryable GetEntities() { ... } 

    //GET api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2 
    [HttpGet] 
    [Route("{id:guid}")] // ALSO NOTE THAT THE PARAMETER NAMES HAVE TO MATCH 
    public Task<IHttpActionResult> GetEntity(Guid id) { ... } 

    //...other code removed for brevity 
} 

확실히 그 속성 라우팅이 웹 API를 설정

config.MapHttpAttributeRoutes(); 
+0

이 솔루션은 작동하지만 지금은 Put 및 Post 메서드가 오류 메시지 "요청한 리소스가 http 메서드 'POST'를 지원하지 않습니다. – Shahzad

+1

@Shahzad 컨트롤러가 모든 특성 라우팅 또는 모든 규칙 기반 당신은 관련 경로와 함께 각각의 액션에'[HttpPost]'와'[HttpPut]'속성이 필요하다. – Nkosi

+0

사실, 나는 모든 속성 라우팅을 사용 중이다. – Shahzad