0

여러 get 메서드를 사용하여 별도의 검색 컨트롤러를 만들었으므로 기본 경로를 수정해야했습니다.ASP.NET의 라우팅 문자열 매개 변수

SearchController.cs

[HttpGet] 
public IEnumerable<Object> CompanyByOrderId(long id) { ... } 
[HttpGet] 
public IEnumerable<Object> CompanyByName(string name) { ... } 
[HttpGet] 
public IEnumerable<Object> UserByName(string name) { ... } 

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "ActionById", 
     routeTemplate: "api/Search/{action}/{id}", 
     defaults: new { controller = "Search", id = RouteParameter.Optional } 
    ); 

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

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

http://localhost:52498/api/Search/CompanyByOrderId/1을 참조하면 잘 작동

. 그러나 매개 변수로 이름을 가진 다른 메소드 중 하나를 호출하면 404 오류가 발생합니다. 예 : http://localhost:52498/api/Search/UserByName/john

문자열 매개 변수가있는 URI가 CompanyByName/UserByName 메서드에 매핑되도록 지정하려면 어떻게해야합니까?

답변

1

:

config.Routes.MapHttpRoute(
    name: "ActionById", 
    routeTemplate: "api/Search/{action}/{id}", 
    defaults: new { controller = "Search", id = RouteParameter.Optional }, 
    constraints: new { id = @"\d+" } 
); 

또는 당신은 완전히 두 번째 경로를 제거하고 액션 서명을 변경할 수 있습니다 {id} 매개 변수 만 사용하는 경우 :

[HttpGet] 
public IEnumerable<Object> CompanyByOrderId(long id) { ... } 
[HttpGet] 
public IEnumerable<Object> CompanyByName(string id) { ... } 
[HttpGet] 
public IEnumerable<Object> UserByName(string id) { ... } 
2

해당 경로를 하드 코딩 할 수 있습니까? 그렇다면 이와 비슷한 것이 효과가 있습니다.

config.Routes.MapHttpRoute(
    name: "CompanyByNameRoute", 
    routeTemplate: "api/Search/CompanyByName/{name}, 
    defaults: new { controller = "Search", action = "CompanyByName", name = RouteParameter.Optional } 
    ); 
그것은 단지 {ID} 매개 변수의 번호와 일치 할 수 있도록 당신은 귀하의 첫 번째 경로에 제약 조건을 추가 할 수
+0

감사합니다. 내가 게시 한 것보다 더 많은 게터가 있기 때문에 나는 그들 각각을 개별적으로 등록하고 싶지 않습니다. 누군가가 좀 더 일반적인 해결책을 제시한다면 나는 기뻐할 것입니다. – Explicat