asp.net - 웹 API 라우팅-api /{controller}/{action}/{id}"기능 장애"API /{컨트롤러}/{id}




routing asp.net-web-api (3)

Global.asax에 기본 경로가 있습니다.

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

특정 기능을 타겟팅 할 수 있기를 원했기 때문에 다른 경로를 만들었습니다.

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

그래서, 내 컨트롤러에서, 나는있다 :

    public string Get(int id)
    {
        return "object of id id";
    }        

    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }

.../api/records/bycategoryid/5 를 호출하면 원하는 정보를 얻을 수 있습니다. 그러나 .../api/records/1 을 호출하면 오류가 발생합니다.

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

그 이유는 이해할 수 있습니다 - 경로는 URL이 올바른지를 정의하지만, 기능 일치와 관련하여 Get(int id)ByCategoryId(int id) api/{controller}/{id} 와 일치합니다. 프레임 워크.

기본 API 경로가 다시 작동하도록하려면 어떻게해야합니까? {action} 유지하십시오. 나는 기본 API 경로를 일치 RecordByCategoryIdController 위해 RecordByCategoryIdController 라는 다른 컨트롤러를 생성 할 것을 고려했다 .../api/recordbycategoryid/5 . 그러나, 나는 그것이 "더러운"(그래서 만족스럽지 못한) 해결책이라는 것을 알았다. 나는 이것에 대한 답을 찾았고 {action} 이있는 경로를 사용하여이 문제를 언급 한 튜토리얼은 없습니다.


Answers

속성 라우팅을 사용 하여 문제를 해결할 수 있습니다.

제어 장치

[Route("api/category/{categoryId}")]
public IEnumerable<Order> GetCategoryId(int categoryId) { ... }

jquery의 URI

api/category/1

경로 구성

using System.Web.Http;

namespace WebApplication
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            // Other Web API configuration not shown.
        }
    }
}

기본 라우팅은 기본 관례 기반 라우팅으로 작동합니다.

제어 장치

public string Get(int id)
    {
        return "object of id id";
    }   

Jquery의 URI

/api/records/1 

경로 구성

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

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

자세한 정보는 여기를 클릭하십시오. 특성 라우팅 및 온 텐션 기반 라우팅 & 여기


라우트 엔진은 규칙을 추가 할 때와 동일한 순서를 사용합니다. 첫 번째 일치 규칙을 얻으면 다른 규칙 검사를 중단하고 컨트롤러 및 작업 검색을 위해이를 수행합니다.

그래서, 당신은해야합니다 :

  1. 특정 규칙을 일반적인 규칙 (예 : 기본값)보다 먼저 넣습니다. 즉, RouteTable.Routes.MapHttpRoute 를 사용하여 먼저 "WithActionApi"를 매핑 한 다음 "DefaultApi"를 매핑해야합니다.

  2. "WithActionApi"규칙의 defaults: new { id = System.Web.Http.RouteParameter.Optional } 매개 변수를 제거하십시오. 일단 id가 선택적이면 "/ api / {part1} / {part2}"와 같은 url은 " DefaultApi "로 설정하십시오.

  3. "DefaultApi"에 명명 된 동작을 추가하여 경로 엔진에 어떤 동작을 입력할지 알려줍니다. 그렇지 않으면 컨트롤러에 둘 이상의 액션이 있으면 엔진은 사용할 액션을 알지 못하고 "요청과 일치하는 액션이 ​​여러 개 발견되었습니다 : ..."를 throw합니다. 그런 다음 Get 메서드와 일치 시키려면 ActionNameAttribute 사용합니다.

따라서 경로는 다음과 같아야합니다.

// Map this rule first
RouteTable.Routes.MapRoute(
     "WithActionApi",
     "api/{controller}/{action}/{id}"
 );

RouteTable.Routes.MapRoute(
    "DefaultApi",
    "api/{controller}/{id}",
    new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);

그리고 당신의 컨트롤러 :

[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
    return "object of id id";
}        

[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
    return new string[] { "byCategory1", "byCategory2" };
}

결국 각 플러그인마다 별도의 사이트를 만들게됩니다. 이렇게하면 각 AppPool에 대한 권한이 낮은 사용자를 만들 수 있으며 시스템 관리자는 해당 사용자 아래에서 실행되는 웹 사이트로 "플러그인"을 설치할 수 있습니다.

모든 대안은 내부 플랫폼 반 패턴을 나타낼 것입니다. 플러그인 호스팅 시스템을 개발하는 데 많은 시간과 돈을 투자하지 않는 한, 그 시스템에 푹 빠져서 재발송하게 될 것입니다. 나는 경험에서 말한다.

사이트는 AspnetIdentity 사용자 repos를 공유 할 수 있으며 참조 할 수있는 dll로 핵심 개체를 제공 할 수 있습니다. CDN에 콘텐츠 (스크립트 파일, CSS, 이미지)를 호스팅하여 참조 할 수 있도록하십시오. 하위 사이트와보기를 공유하려면 다음과 같이 리소스로 컴파일하십시오.

ASP.NET MVC 웹 응용 프로그램에 미리 컴파일 된 뷰 포함

행운을 빕니다!







asp.net routing controller asp.net-web-api action