programing

웹 API에서 요청과 일치하는 여러 작업이 발견되었습니다.

newstyles 2023. 6. 18. 12:26

웹 API에서 요청과 일치하는 여러 작업이 발견되었습니다.

두 개의 "Get" 메서드를 사용하려고 하면 이 오류가 계속 발생합니다.

요청과 일치하는 여러 작업이 발견되었습니다. webapi

스택에서 이와 유사한 다른 질문들을 둘러보았지만 이해할 수 없습니다.

2개의 다른 이름이 있으며 "HttpGet" 속성을 사용합니다.

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

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

당신의 노선도는 아마도 WebApiConfig.cs 에서 다음과 같습니다.

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)
{
    return 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 을 참조하십시오.

Web API(기본적으로)에서 메서드는 HTTP 메서드와 경로 값의 조합을 기반으로 선택됩니다.

MyVm개체처럼 , 데이터 에서 두 할 수 있습니다(두 변수가 dispatcher)를할 수 없게 만듭니다. 이는 디스패처를 불가능하게 만듭니다.IHttpActionSelector하여 해당 항목과 를 선택하여 해당 항목과 일치시킵니다.

모호성을 해결하려면 쿼리 문자열 또는 경로 매개 변수를 사용하여 서로 다른 값을 지정해야 합니다.

웹을 많이 검색하고 라우팅 맵에 가장 적합한 양식을 찾으려고 노력한 결과 다음을 발견했습니다.

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) 모두에 적용되는 매핑입니다.

이것은 모든 것이 정확하다는 것을 알고 50번이나 확인한 모든 사람들을 위한 답입니다...

반복적으로 보고 있지 않은지 확인하십시오.RouteConfig.cs.

하고자 하는 은 편할파이지름다니습었정되이입니다.WebApiConfig.cs

또한 다음과 같이 표시되어야 합니다.

using System.Web.Http;

namespace My.Epic.Website
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
          config.MapHttpAttributeRoutes();

          // api/Country/WithStates
          config.Routes.MapHttpRoute(
            name: "ControllerAndActionOnly",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { },
            constraints: new { action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$" });

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

저는 3시간 정도 절약할 수 있었습니다.

웹 메서드가 동일한 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

두 가지 Get 메서드가 있을 때 파라미터가 없는 메서드와 파라미터로 복잡한 유형의 메서드가 있는데 동일한 오류가 발생했습니다.Id라는 이름의 int 형식의 더미 매개 변수를 첫 번째 매개 변수로 추가하고 그 다음에 복잡한 형식 매개 변수를 추가하여 이 문제를 해결했습니다.그런 다음 경로 템플릿에 복합 유형 매개 변수를 추가했습니다.다음은 저에게 효과가 있었습니다.

첫 번째 가져오기:

public IEnumerable<SearchItem> Get()
{
...
}

두 번째 가져오기:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

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

웹 API 컨트롤러 대신 MVC 컨트롤러를 사용하기 때문에 가능합니다.Web API 컨트롤러의 네임스페이스를 확인합니다. 이름 공간은 다음과 같아야 합니다.

using System.Net;
using System.Net.Http;
using System.Web.Http;

네임스페이스가 다음과 같으면 webapi 컨트롤러 메서드 호출에서 위의 오류가 발생합니다.

using System.Web;
using System.Web.Mvc;

이름과 매개 변수가 다른 두 가지 방법이 있는지 확인하십시오.

그렇다면 메서드를 삭제하고 시도하십시오.

추가 작업으로 웹 API 컨트롤러를 확장하려고 시도하는 동안 이 문제를 발견했습니다.

당신이 했을 것이라고 가정합니다.

public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

[HttpGet]
public void ReSeed()
{
    // Your custom action here
}

TS에서 설명한 문제를 유발하는 /api/controller에 대한 요청을 충족하는 두 가지 방법이 있습니다.

추가 작업에 "dummy" 매개 변수를 추가하고 싶지 않았기 때문에 기본 작업을 조사하고 다음을 생각해 냈습니다.

[ActionName("builtin")]
public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

첫 번째 방법과 "접두사" 경로 바인딩의 조합:

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

config.Routes.MapHttpRoute(
    name: "CustomActionApi",
    routeTemplate: "api/{controller}/{action}");

첫 번째 경로 템플릿에 "action" 매개 변수가 없더라도 "일반" WebAPI 호출의 라우팅과 추가 작업에 대한 호출을 구분할 수 있도록 기본 작업을 구성할 수 있습니다.

나의 경우 모든 것이 옳았습니다.

웹 구성이 올바르게 구성됨 2) 경로 접두사 및 경로 특성이 적절함

그래도 오류가 발생했습니다.내 경우 "Route" 특성(F12를 눌러)은 System을 가리켰습니다.Web.MVC는 있지만 시스템은 아닙니다.문제의 원인이 된 Web.Http.

추가할 수 있습니다.[Route("api/[controller]/[action]")]컨트롤러 클래스로 이동합니다.

[Route("api/[controller]/[action]")]
[ApiController]
public class MySuperController : ControllerBase
{
 ...
}

오래된 질문인 것은 알지만 가끔 Angular 같은 서비스 리소스를 사용할 때JS가 WebAPI에 연결하려면 올바른 경로를 사용하고 있는지 확인하십시오. 그렇지 않으면 이 오류가 발생합니다.

[HttpPost/Put/Get/Delete] 특성을 사용하여 기본 GET|PUT|POST|DELETE 작업의 컨트롤러 메서드를 장식하지 마십시오.바닐라 포스트 컨트롤러 작업에 이 속성을 추가했는데 404가 발생했습니다.

이것이 누군가에게 도움이 되기를 바랍니다. 왜냐하면 그것은 매우 좌절감을 줄 수 있고 진보를 멈추게 할 수 있기 때문입니다.

예: => 테스트 컨트롤러

        [HttpGet]
        public string TestMethod(int arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod2(string arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod3(int arg0,string arg1)
        {
            return "";
        }

당신이 WebApiConfig.cs 파일만 변경할 수 있다면요.

 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/",
                defaults: null
            );

그게 다야 :)

결과:

다음과 같이 시도해 보셨습니까?

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

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

언급URL : https://stackoverflow.com/questions/14534167/multiple-actions-were-found-that-match-the-request-in-web-api