asp.netcore 시리즈 5 MVC 프레임 라우팅(위)

7865 단어
하나.개술
Asp. 소개netcore 루트를 작성할 때, 나는 초보적으로 몇 편으로 나누어 설명하려고 생각했다.루트에 대한 지식이 많기 때문에 공식 문서를 참고하여 중요한 지식을 추출해 냈다.ASP에서.NET Core에서는 전송 요청의 URL을 일치시키는 라우팅 중간부품을 사용하여 작업에 매핑합니다.라우팅은 프로그램이 시작될 때 기존 라우팅 또는 속성 라우팅을 정의합니다.라우팅 설명은 URL 경로를 작업과 일치시키는 방법을 설명합니다.또한 응답에서 전송된 URL(링크)을 생성하는 데도 사용됩니다.
라우팅 작업은 기존 라우팅과 속성 라우팅을 모두 지원합니다.블렌드해서 사용할 수도 있습니다.일반적으로 기존 라우팅은 브라우저의 HTML 페이지를 처리하는 컨트롤러에 사용됩니다.속성 라우팅은 웹 API를 처리하는 데 사용되는 컨트롤러입니다.
1.1 루트 중간부품을 설정할 때 전통적인 루트를 사용하려면 UseMVC 중간부품에서 IRouteBuilder 인터페이스를 설정해야 한다. asp.net core mvc 2.2 프레임워크에서 응용 프로그램 Startup의 Configure 메서드에서 기본 라우팅 설정은 다음과 같습니다.
app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

UseMvc 호출에서 MapRoute는 단일 루트를 만드는 데 사용되며,default 루트라고도 부른다.대부분의 MVC 응용 프로그램은 템플릿이 있는 라우트를 사용합니다.default 라우팅의 간편한 방법:
 app.UseMvcWithDefaultRoute();

UseMvc와 UseMvcWithDefaultRoute는 중간부품 파이프에 Router Middleware의 실례를 추가할 수 있습니다.MVC는 중간부품과 직접 상호작용하지 않고 루트를 사용하여 요청을 처리합니다.MVC는 MvcRouteHandler 인스턴스를 통해 라우트에 연결됩니다.
UseMvc는 속성 루트의 루트 집합에 자리 차지 문자 {controller=Home}/{action=Index}/{id?}를 추가하는 루트를 직접 정의하지 않습니다.UseMvc(Action)를 다시 로드하면 사용자가 자신의 라우트를 추가할 수 있으며 속성 라우팅도 지원됩니다.
1.2 레거시 라우팅 레거시 라우팅은 URL이 읽을 수 있도록 설명하는 라우팅 체계입니다.전통적인 루트 형식: {controller=Home}/{action=Index}/{id?}이러한 URL 경로는 첫 번째 단락은 컨트롤러 이름에 비추고 두 번째 단락은 조작 이름에 비추고 두 번째 단락은 선택할 수 있는 ID에 비추는 약정을 설정합니다.(1) 기본 라우팅 사용:
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");

이 기본 경로를 사용할 때: url 경로/Products/List는 프로그램 Products Controller (컨트롤러) 에 비칩니다.List 에서url 경로/Blog/Article/17은 프로그램 Blog Controller (컨트롤러) 에 비칩니다.Article(action)에서
(2) 다중 루트: MapRoute에 대한 여러 호출을 추가하여 UseMvc에 여러 개의 루트를 추가할 수 있습니다.이렇게 하면 여러 규칙을 정의하거나 특정 작업에만 적용되는 기존 경로를 추가할 수 있습니다. 예를 들어 다음과 같습니다.
app.UseMvc(routes =>
    {
     routes.MapRoute("blog", "blog/{*article}",
            defaults: new { controller = "Blog", action = "Article" });
     routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
   });

이곳의 블로그 루트는 하나의 전용 전통 루트이다. 이것은 블로그가 전통 루트 시스템을 사용하지만 특정한 조작, 즉 Blog Controller 컨트롤러의 Article 조작에 대해 이 전용 루트는 항상 비추는 것을 의미한다.여러 루트의 루트 집합은 정렬되고 추가 순서에 따라 처리됩니다. 따라서 이 예시에서 블로그 루트를 먼저 시도하고default 루트를 시도합니다.(3) action 작업의 구분은 url 요청을 처리할 때, 루트를 통해 컨트롤러 내의 두 개의 같은 action 이름과 일치할 때, mvc는 최적 후보를 선택하기 위해 구분해야 한다. 그렇지 않으면 이상을 일으킬 수 있다. (Ambiguous Action Exception)
 public class ProductsController : Controller
     { 
       public IActionResult Edit(int id) { ... }

       [HttpPost] 
      public IActionResult Edit(int id, Product product) { ... }
     }

이 Products 디렉터는 URL 경로의/Products/Edit/17과 일치하는 두 가지 작업을 정의합니다.해결 방안은 제출할 액션에 Http 술어를 붙이는 것이 POST입니다.이렇게 post가 오면 Edit (int, Product) 1.3 속성 루트를 선택합니다. 컨트롤러 (Controller) 나 조작 (Action) 에 루트를 배치하면 속성 루트를 실현할 수 있습니다.전통적인 루트 접근을 통해 속성 루트를 정의하는 작업을 할 수 없고, 반대로도 마찬가지다.컨트롤러의 모든 라우팅 속성은 컨트롤러의 모든 작업에 속성 라우팅을 사용합니다.
속성 루트는 하나의 속성을 사용하여 액션을 루트 템플릿에 직접 비추는 것입니다.다음 예제에서 Configure 메서드는 app를 사용합니다.UseMvc();,라우팅이 전달되지 않습니다.이 URL은 기본 루트 {controller=Home}/{action=Index}/{id?}와 일치하는 URL입니다.일치하는 URL은 다음과 같습니다.
default 기본 루트 템플릿을 제거한 후 app만 사용합니다.UseMvc()일 경우프로그램을 실행할 때, 페이지 보고 404 오류:localhost의 웹 페이지를 찾을 수 없습니다.
  app.UseMvc();

(1) 속성 라우팅 기본 사용
속성 라우팅 작업이 정의된 경우 속성 라우팅 기능이 시작됩니다.Home Controller에 대한 속성 라우팅의 예는 다음과 같습니다.
 public class HomeController : Controller
    {
       [Route("")]
       [Route("Home")]
       [Route("Home/Index")]
       public IActionResult Index()
       {
          return View();
       }
    }

index action에 [Route("")] 속성 라우트를 추가합니다.브라우저는 다음 세 가지 URL을 사용하여 액세스할 수 있으며 프로그램이 시작될 때 기본적으로 로드되는 페이지입니다.
http://localhost:30081/
http://localhost:30081/Home/
http://localhost:30081/Home/index
(2) 속성 루트를 정확하게 제어하려면 더 많은 입력이 루트를 지정해야 한다.전통적인 기본 루트는 루트를 처리하는 방식이 더욱 간결하다.그러나 속성 라우팅을 사용하면 각 작업에 적용되는 라우팅 템플릿을 정확하게 제어할 수 있습니다.다음 예는 모든 동작을 정확하게 제어하는 루트 템플릿입니다. 예를 들어 URL이/홈/index에 접근할 때 MyIndex의 action 방법을 호출합니다.
public class MyDemoController : Controller
    {
       [Route("")]
       [Route("Home")]
       [Route("Home/Index")]
       public IActionResult MyIndex()
       {
          return View("Index");
       }
    }

1.4 Http[Verb] 속성을 사용하는 속성 라우팅
 [HttpGet("/products")]
    public IActionResult ListProducts()
    {
       // ...
    }

    [HttpPost("/products")]
    public IActionResult CreateProduct(...)
    {
       // ...
    }

Http 용어가 GET이면 Productsapi가 실행됩니다.Http 용어가 POST인 경우 Products Api를 실행하는 ListProducts 작업CreateProduct.REST API를 생성할 때 작업 방법에 [Route(...)]가 거의 사용되지 않습니다.API가 지원하는 작업을 명확히 하기 위해 보다 특정한 HttpVerbAttributes를 사용하는 것이 좋습니다.REST API 클라이언트는 특정 논리 작업에 매핑되는 경로와 Http 술어를 알아야 합니다.예를 들어 다음 웹 api 액세스 라우트는 HttpVerbAttributes를 사용하여 다음과 같이 명시적으로 정의됩니다.
public class ProductsApiController : Controller
    {
       [HttpGet("/products/{id}", Name = "Products_List")]
       public IActionResult GetProduct(int id) { ... }
    }

위의 정의는 url, 예를 들어:/products/3 (/products 대신) 에 접근하는 URL에만 Products Api를 실행할 수 있습니다.GetProduct 작업1.5 라우팅 병합 속성 라우팅의 중복을 줄이려면 컨트롤러 Controller의 라우팅 속성을 개별 작업 Action의 라우팅 속성과 병합합니다.컨트롤러에 정의된 모든 라우팅 템플릿은 작업상 라우팅 템플릿의 접두어로 사용됩니다.컨트롤러에 라우팅 속성을 배치하면 컨트롤러의 모든 작업에 속성 라우팅이 사용됩니다.
다음은 Get에 액세스하는 메서드의 액세스 경로인 웹api 라우팅 병합입니다.http://localhost:30081/api/Products/1
[Route("api/Products")]
    public class ProductsApiController : Controller
    {
        // GET api/values/5
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }
    }

다음은 컨트롤러의 루트 통합입니다.index 페이지에 대한 액세스 경로는 다음과 같습니다.http://localhost:30081/home/index
[Route("Home")]
  public class HomeController : Controller
  {
    [Route("")]      // Combines to define the route template "Home"
    [Route("Index")] // Combines to define the route template "Home/Index"
    [Route("/")]     // Doesn't combine, defines the route template ""
    public IActionResult Index()
    {
      //...
    }
  }

1.6 속성 라우팅 매개변수 구속조건 지정하기
 [HttpGet("Home/{id:int}",Name = "Pri")]
        public IActionResult Privacy(int id)
        {
            return View();
        }

정수 유형이 아닌 매개변수를 입력하면 브라우저에서 다음 웹 주소에 해당하는 웹 페이지를 찾을 수 없다는 프롬프트를 표시합니다.http://localhost:30081/home/dd
1.7 사용자 정의 라우팅 속성 프레임에 제공된 모든 라우팅 속성([Route(...)],[HttpGet(...)] 등) IRouteTemplateProvider 인터페이스를 사용할 수 있습니다.응용 프로그램이 시작되면 MVC는 컨트롤러 클래스와 조작 방법의 속성을 찾고 IRouteTemplateProvider의 속성을 사용하여 초기 루트를 생성합니다.
다음은 IRouteTemplateProvider를 사용하여 라우팅 속성을 정의합니다.각 IRouteTemplateProvider는 사용자 정의 라우팅 템플릿, 순서 및 이름을 포함하는 라우트를 정의할 수 있습니다.
public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider
    {
        //         ,   [controller]       。
        public string Template => "api/[controller]/{action}/{id?}";

        public int? Order { get; set; }

        public string Name { get; set; }
    }    

    public class ProductsApiController : Controller
    {
        // GET api/values/5
        //  [HttpGet("{id}")]
        [MyApiController()]
        public string Get(int id)
        {
            return "value";
        }
    }

URL에 액세스하여 다음을 수행합니다.http://localhost:30081/api/ProductsApi/get/1get 방법을 호출합니다.
참고 문헌
공식 자료:asp.net core routing

좋은 웹페이지 즐겨찾기