웹 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
메소드에 전달 된 매개 변수 가 속성 라우팅 시스템이 int
s 및 Guid
s 의 경우와 같이 유형을 구별하기에 충분히 다른 경우 [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] 꾸미기를하면 효과가있었습니다.