2016-12-20 1 views
1

사이트에 웹 API가 있습니다. api 호출에 매개 변수가 없으면 매개 변수가 있으면 해당 매개 변수를 사용할 수 없습니다. 아래는 내가 말하는 것에 대한 예입니다.MVC API의 게시 매개 변수 문제

[HttpGet] 
public string GetFacilityName2() 
{ 
    return "Good"; 
} 

[HttpGet] 
public string GetFacilityName(string projectNumber) 
{ 
    return "Never Get Here"; 
} 

현재로서는 내 구성 경로가 기본값입니다.

config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

다음 두 개의 URL을 사용하고 있습니다. 작동하는 하나의 URL은 내가 이것을했다 API에 세 번째 방법을했다 http://localhost/api/Controller/GetFacilityName?projectNumber=44

UPDATE 입니다 작동하지 않습니다 하나 http://localhost/api/Controller/GetFacilityName2

URL입니다.

[HttpGet] 
public Address GetWorkplaceAddress(string projectNumber) 
{ 
    return new Address(); 
} 

API에서 이것을 제거하면 다른 방법이 작동하기 시작했습니다. 주소는 이와 같이 정의됩니다.

public class Address 
{ 
    public int Id { get; set; } 
    public string AddressValue { get; set; } 
    public string City { get; set; } 
    public int? State { get; set; } 
    public string Zip { get; set; } 
    public int? Country { get; set; } 
} 
+0

매개 변수를 기준으로 컨트롤러에서 작업을 오버로드 할 수 없습니다. RouteAttribute를 사용하여 이름으로 실행하려는 동작을 지정하거나 HTTP 동사 (Get, Post, Put 등)로 지정할 수 있습니다. – Igor

+0

컨트롤러의 각 동작에는 고유 한 이름이 있습니다. 위의 차이점은 끝에 '2'문자가됩니다. – Nate

+0

라우트 템플리트가 이름을 완전히 무시하기 때문에 (즉, {action}이없고) RouteAttributes가없고 사용 된 http 동사의 키 오프를 제외하기 때문에 중요하지 않습니다. – Igor

답변

2

컨트롤러에 코드가 현재 작성된 방식 인 매개 변수로 작업을 오버로드 할 수 없습니다. 당신은

  • 는 HTTP 동사하여 지정할 수 있습니다 RouteAttribute
  • 경로 템플릿 routeTemplate: "api/{controller}/{action}/{id}",

OR을 사용하는 이름으로 발생 할 작업을 지정할 수 있습니다

(가져 오기 , Post, Put 등)에 대한 정보를 제공합니다.

+1

이것은 효과가 있습니다. 나는 그것을 완전히 보았다. 감사합니다 – Nate

+0

@ 네이트 - 다행 당신을 위해 일했다. 답변을 수락하는 것을 고려해보십시오 (15 분의 기간이 만료되면 [SO 답변 수락 방법] (http://meta.stackexchange.com/a/5235) 참조). – Igor

+0

시스템이 대답으로 받아 들일 수있게되기까지 3 분 남았습니다. – Nate