[C#] Web Api의 요청과 일치하는 여러 조치가 발견되었습니다.

2 개의 “Get”메소드를 사용하려고하면이 오류가 계속 발생합니다.

요청과 일치하는 여러 조치가 발견되었습니다. webapi

나는 이것에 대해 다른 비슷한 질문을 둘러 보았지만 얻지 못했습니다.

2 개의 다른 이름이 있고 “HttpGet”속성을 사용하고 있습니다.

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}



답변

경로지도는 다음과 같습니다.

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

그러나 동일한 http 메소드로 여러 작업을 수행하려면 다음과 같이 경로를 통해 webapi에 자세한 정보를 제공해야합니다.

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

routeTemplate에 이제 조치가 포함되어 있습니다. 여기에 더 많은 정보가 있습니다 : http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

최신 정보:

자, 이제 나는 당신이 여기에있는 것을 이해한다고 생각합니다.

아마도 당신은 action url 매개 변수가 필요하지 않으며 다른 방법으로 당신이 따르는 내용을 설명해야합니다. 메소드가 동일한 엔티티에서 데이터를 리턴한다고 말하고 있으므로 매개 변수가 설명을 수행하게하십시오.

예를 들어 두 가지 방법으로 전환 할 수 있습니다.

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

MyVm 개체에 어떤 종류의 데이터를 전달하고 있습니까? URI를 통해 변수를 전달할 수 있다면 해당 경로로 이동하는 것이 좋습니다. 그렇지 않으면 요청 본문에 객체를 보내야하며 GET을 수행 할 때 HTTP가 아닙니다 (하지만 MyVm의 [FromBody]를 사용하십시오).

바라건대 이것은 액션 이름이나 [HttpGet] 속성을 사용하지 않고 단일 컨트롤러에서 여러 GET 메소드를 가질 수 있음을 보여줍니다.


답변

Web API 2부터 업데이트하십시오.

WebApiConfig.cs 파일에서이 API 구성을 사용하면 :

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

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

컨트롤러를 다음과 같이 라우팅 할 수 있습니다.

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    rturn null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

여기서 ControllerName은 컨트롤러의 이름입니다 ( “컨트롤러”제외). 이를 통해 위에서 설명한 경로로 각 작업을 수행 할 수 있습니다.

더 읽을 거리 : http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2


답변

웹 API에서 (기본적으로) 메소드는 HTTP 메소드와 라우트 값조합을 기반으로 선택 됩니다 .

MyVm본문에서 포맷터로 읽은 복잡한 객체처럼 보이므로 경로 데이터와 관련하여 두 가지 동일한 방법이 있습니다 (라우터의 매개 변수가 없기 때문에) 발송자 ( IHttpActionSelector)가 적절한 것을 일치시킬 수 없습니다. .

모호성을 해결하려면 querystring 또는 route 매개 변수로 이들을 구별해야합니다.


답변

웹을 많이 검색하고 다음을 찾은 경우 라우팅 맵에 가장 적합한 양식을 찾으려고 시도한 후

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

이 맵핑은 조치 이름 맵핑과 기본 http 규칙 (GET, POST, PUT, DELETE) 모두에 적용됩니다.


답변

웹 메소드가 동일한 URL로 해석 될 수 있습니다. 다음 링크를 살펴보십시오.

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

따라서 분석법 이름을 라우팅 테이블에 추가해야 할 수도 있습니다.


답변

조치를 사용하지 않으면 옵션은 다음과 같습니다.

  1. 메소드 중 하나를 다른 컨트롤러로 이동하여 충돌하지 않도록하십시오.

  2. 매개 변수를 취하는 하나의 메서드 만 사용하고 null 인 경우 코드에서 다른 메서드를 호출하십시오.


답변

이 솔루션은 저에게 효과적이었습니다.

WebApiConfig에서 Route2를 먼저 배치하십시오. 또한 각 메소드 앞에 HttpGet 및 HttpPost를 추가하고 URL에 컨트롤러 이름 및 메소드 이름을 포함하십시오.

WebApiConfig =>

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

컨트롤러 =>

public class ValuesController : ApiController
{

    [HttpPost]
    public string GetCustomer([FromBody] RequestModel req)
    {
        return "Customer";
    }

    [HttpPost]
    public string GetCustomerList([FromBody] RequestModel req)
    {
        return "Customer List";
    }
}

URL =>

http://localhost:7050/api/Values/GetCustomer

http://localhost:7050/api/Values/GetCustomerList