ASP.NET 웹 API에서 여러 GET 메소드가있는 단일 컨트롤러 GetChildItems(CustomParam parameter,

웹 API에서는 비슷한 구조의 클래스가 있습니다.

public class SomeController : ApiController
{
    [WebGet(UriTemplate = "{itemSource}/Items")]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

개별 방법을 매핑 할 수 있으므로 적절한 장소에서 올바른 요청을 얻는 것이 매우 간단했습니다. 단일 GET메소드 만 가지고 있지만 Object매개 변수 가있는 유사한 클래스의 경우 성공적으로 사용했습니다 IActionValueBinder. 그러나 위에서 설명한 경우 다음과 같은 오류가 발생합니다.

Multiple actions were found that match the request:

SomeValue GetItems(CustomParam parameter) on type SomeType

SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType

지금까지의 ExecuteAsync방법을 재정 의하여이 문제에 접근하려고 ApiController하지만 운이 없습니다. 이 문제에 대한 조언이 있습니까?

편집 : 라우팅에 다른 접근 방식을 가진 ASP.NET 웹 API 에서이 코드를 이동하려고한다고 언급하는 것을 잊었습니다. 문제는 ASP.NET 웹 API에서 코드가 작동하게하려면 어떻게해야합니까?



답변

이것이 추가 GET 메소드를 지원하고 일반 REST 메소드도 지원하는 가장 좋은 방법입니다. WebApiConfig에 다음 경로를 추가하십시오.

routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new {action = "Post"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Post)});

아래 테스트 클래스 로이 솔루션을 확인했습니다. 아래 컨트롤러에서 각 방법을 성공적으로 수행 할 수있었습니다.

public class TestController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }

    public string Get(int id)
    {
        return string.Empty;
    }

    public string GetAll()
    {
        return string.Empty;
    }

    public void Post([FromBody]string value)
    {
    }

    public void Put(int id, [FromBody]string value)
    {
    }

    public void Delete(int id)
    {
    }
}

다음 요청을 지원하는지 확인했습니다.

GET /Test
GET /Test/1
GET /Test/GetAll
POST /Test
PUT /Test/1
DELETE /Test/1

참고 하여 추가 GET 작업이 시작되지 않는 경우이 방법에 HttpGet 속성을 추가 할 수 있습니다 ‘가져 오기’고.


답변

이것에서 가십시오 :

config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

이에:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });

따라서 이제 HTTP 요청을 보낼 작업 (방법)을 지정할 수 있습니다.

에 게시 에 “http : // localhost를 : 8383 / API / 명령 / PostCreateUser” 호출합니다

public bool PostCreateUser(CreateUserCommand command)
{
    //* ... *//
    return true;
}

및 게시에 “: // localhost를 8383 / API / 명령 / PostMakeBooking HTTP” 호출합니다

public bool PostMakeBooking(MakeBookingCommand command)
{
    //* ... *//
    return true;
}

나는 자체 호스팅 WEB API 서비스 응용 프로그램에서 이것을 시도했고 그것은 매력처럼 작동합니다 🙂


답변

코드를 통해 수동으로 추가하는 것보다 사용하기 쉬운 속성을 찾습니다. 다음은 간단한 예입니다.

[RoutePrefix("api/example")]
public class ExampleController : ApiController
{
    [HttpGet]
    [Route("get1/{param1}")] //   /api/example/get1/1?param2=4
    public IHttpActionResult Get(int param1, int param2)
    {
        Object example = null;
        return Ok(example);
    }

}

webapiconfig에서도 필요합니다.

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

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

좋은 링크들
http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
라우팅을 더 잘 설명합니다.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api


답변

global.asax.cs에서 다음과 같이 추가 경로를 정의해야합니다.

routes.MapHttpRoute(
    name: "Api with action",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

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

답변

최신 Web Api 2에서는 여러 가지 get 메소드를 사용하는 것이 더 쉬워졌습니다.

GET메소드에 전달 된 매개 변수 가 속성 라우팅 시스템이 ints 및 Guids 의 경우와 같이 유형을 구별하기에 충분히 다른 경우 [Route...]속성에 예상되는 유형을 지정할 수 있습니다

예를 들어-

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{

    // GET api/values/7
    [Route("{id:int}")]
    public string Get(int id)
    {
       return $"You entered an int - {id}";
    }

    // GET api/values/AAC1FB7B-978B-4C39-A90D-271A031BFE5D
    [Route("{id:Guid}")]
    public string Get(Guid id)
    {
       return $"You entered a GUID - {id}";
    }
} 

이 방법에 대한 자세한 내용은 여기를 참조하십시오 http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/

다른 옵션은 GET방법에 다른 경로 를 제공하는 것 입니다.

    [RoutePrefix("api/values")]
    public class ValuesController : ApiController
    {
        public string Get()
        {
            return "simple get";
        }

        [Route("geta")]
        public string GetA()
        {
            return "A";
        }

        [Route("getb")]
        public string GetB()
        {
            return "B";
        }
   }

자세한 내용은 여기를 참조하십시오 -http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/


답변

ASP.NET Core 2.0에서는 경로 속성을 컨트롤러에 추가 할 수 있습니다 .

[Route("api/[controller]/[action]")]
public class SomeController : Controller
{
    public SomeValue GetItems(CustomParam parameter) { ... }

    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

답변

여러 Get 메소드를 허용하기 위해 Web Api 2 속성 라우팅을 사용하려고 시도했지만 이전 답변의 유용한 제안을 통합했지만 Controller에서는 “특별한”메소드 만 장식했습니다 (예).

[Route( "special/{id}" )]
public IHttpActionResult GetSomethingSpecial( string id ) {

… 또한 컨트롤러 상단에 [RoutePrefix]를 배치하지 않아도됩니다 :

[RoutePrefix("api/values")]
public class ValuesController : ApiController

제출 된 URI와 일치하는 경로를 찾을 수 없다는 오류가 발생했습니다. 일단 [Route] 메소드를 꾸미고 Controller 전체를 [RoutePrefix] 꾸미기를하면 효과가있었습니다.