Routing in ASP.NET 4

ASP.NET 4 는 웹폼에서 라우팅하는 것을 사용하기 위한 지원이 추가로 내장되었습니다. 라우팅은 당신이 요청한  URL 들을 받아들이기위한 어플리케이션을 확인하게 합니다. 그 URL들은 물리적 파일경로를 보여주지 않습니다. 대신에, 당신은 사용자들에게 의미있고, 당신의 어플리케이션을 위한 검색엔진 옵티마이저에 도움을 줄 수 있는 URL로 정의하여 라우팅을 사용 할 수 있습니다. 예를들어,  존재하고 있는 어플리케이션안에서 제품 종류를 보여주는 페이지를 위한 URL은 다음의 예와 같이 보여 줄 수 있습니다.

http://website/products.aspx?categoryid=12

라우팅을 사용사면, 당신은 같은 정보를 랜더링하기 위하여 다음의 URL을 받아들이기 위하여 어플리케이션을 확인 할 수 있습니다.

http://website/products/software

라우팅은 ASP.NET 3.5 SP1 에서 사용이 가능했습니다. (ASP.NET 3.5 SP1 에서 라우팅을 사용하는 방법에 대한 예는, Phil Haack의 블로그의 Using Routing With WebForms 에 들어가 보세요) 그러나, ASP.NET 4은 라우팅을 사용하기 더 쉽게 만들어진 다음의 몇가지 특징이 있습니다.

  • PageRouteHandler  클래스는 당신이 경로를 정의할 때 사용하는 간단한 HTTP 핸들러입니다.
  • HttpRequest.RequestContext  과Page.RouteData(HttpRequest.RequestContext.RouteData 객체를 위한 대리의 것) 새로운 속성. 이 속성들은 경로로 부터 통과되었을 때의 정보에 접근을 더 쉽게 합니다.
  • System.Web.Compilation.RouteUrlExpressionBuilderSystem.Web.Compilation.RouteValueExpressionBuilder 안에 정의된 다음의 새로운 표현의 빌더들
    • RouteUrl 은 ASP.NET 서버 컨트롤에서 경로 URL 형식에 일치하는 URL을 창조하는 간단한 방법을 제공한다.
    • RouteValue RouteContext 객체로 부터 정보를 추출하여 간단한 방법으로 제공한다.
  • RouteParameter 클래스는 데이터 소스 컨트롤을 위한 쿼리에서 RouteContext 객체안에 포함된 데이터를 넘기기 쉽게 합니다.(FormParameter 에서 유사하다).

 

Routing for Web Forms Pages

다음의 예는 Route 클래스의 새로운 MapPageRoute  매소드를 사용하는 것에 의하여 웹폼 라우트를 정의하는 법을 보여줍니다:

public class Global : System.Web.HttpApplication
{
  void Application_Start(object sender, EventArgs e)
  {
    RouteTable.Routes.MapPageRoute("SearchRoute",
      "search/{searchterm}", "~/search.aspx");
    RouteTable.Routes.MapPageRoute("UserRoute",
      "users/{username}", "~/users.aspx");
  }
}

ASP.NET 4 는 MapPageRoute 매소드를 소개합니다. 다음의 예는 이전의 예에서 보여준 SearchRoute 정의와 같습니다. 그러나 PageRouteHandler 클래스를 사용합니다. 

RouteTable.Routes.Add("SearchRoute", new Route("search/{searchterm}",
  new PageRouteHandler("~/search.aspx")));

예시 코드는 물리적 페이지에서 경로는 보여줍니다(첫번째 라우트안에서, ~/search.aspx 로). 첫번째 라우트 정의는 또한 searchterm 이라고 이름지어진 파라미터는 URL로 부터 추출 되어지고, 페이지로 넘겨지게 되는 것을 명시합니다.

MapPageRoute 매소드는 다음의 매소드 오버로드를 지원합니다:

  • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess)
  • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults)
  • MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults, RouteValueDictionary constraints)

checkPhysicalUrlAccess 파라미터는 다음을 명시합니다. 그것은 라우트된 물리적 페이지(이 때는 search.aspx)를 위한 보안 승인과 들어오는 URL(이 때는 search/{searchterm})의 승인을 체크해야 되는지입니다. checkPhysicalUrlAccess 의 값이 false 라면, 단지 들어오는 URL의 승인만 체크 될 것입니다. 이 승인은 다음과 같은 설정으로 Web.config 파일안에서 정의 됩니다.

<configuration>
  <location path="search.aspx">
    <system.web>
      <authorization>
        <allow roles="admin"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
  <location path="search">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>
 

예시의환경설정에서, admin권한을 가진 사람들을 제외하고 모든 사용자들은 물리적 페이지 search.aspx 에 접근이
거부됩니다.
checkPhysicalUrlAccess 파라미터가 true (기본 값)로 설정 되었을 때, 단지 admin 사용자가 URL /search/{searchterm} 에 접근이 허용됩니다. 왜냐하면 물리적 페이지 search.aspx는 그 역할안에 있는 사용자들에게 제한이 됩니다. checkPhysicalUrlAccessfalse 로 설정되고 그 사이트가 이전 예에서 보여준것 처럼 환경설정이 되어 있다면, 모든 권한받은 사용자들이 URL /search/{searchterm}에 접근이 허용됩니다.

Reading Routing Information in a Web Forms Page

웹폼의 물리적 페이지상의 코드에서 당신은 두 가지 새로운 속성을 사용하는 것에 의하여 라우팅이 URL(혹은 다른 객체가 RouteData 객체에 추가한 다른 정보)로 부터 추출한 정보에 접근 할 수 있습니다: HttpRequest.RequestContextPage.RouteData. (Page.RouteData wraps HttpRequest.RequestContext.RouteData.) 다음의 예는 Page.RouteData 를 사용하는 법을 보여줍니다.

protected void Page_Load(object sender, EventArgs e)
{
  string searchterm = Page.RouteData.Values["searchterm"] as string;
  label1.Text = searchterm;
}

예시의 라우트는 더 쉽게 정의 됨으로써, 그 코드는 searchterm 파라미터를 위하여 넘겨진 값을 추출합니다. 다음의 요청 URL을 고려해 봅시다:

http://localhost/search/scott/

이 요청이 만들어 졌을 때 "scott"이라는 단어는 search.aspx 페이지안에 랜더링 될 것입니다.

Accessing Routing Information in Markup

이전의 섹션에서 설명된 매소드는 웹폼 페이지 상의 코드에서 라우트 데이터를 얻는 법을 보여주었습니다. 당신은 또한 마크업 안에 표현들을 사용할 수 있는데, 그 마크업은 당신이 같은 정보에 접근할 수 있게 합니다. Expression builders는 "ASP.NET의 숨겨진 보석"으로 설명되어 졌습니다. (Phil Haack의 블로그의 Express Yourself With Custom Expression Builders 에 들어가 보세요). 아주 불행하게도 그것들은 잘 알려지지 않았습니다. 왜냐하면 표현 빌더들은 명령형 코드와 함께 작업하기 강력하고 센련되었기 때문입니다.

ASP.NET 4는 웹폼 라우팅을 위한 두 가지의 새로운 표현 빌더들을 포함합니다. 다음의 예는 그것들을 사용하는 방법을 보여줍니다.

<asp:HyperLink ID="HyperLink1" runat="server"
  NavigateUrl="<%$RouteUrl:SearchTerm=scott%>">Search for Scott</asp:HyperLink>

예제에서, RouteUrl  표현은 라우트 파라미터에 기반한 URL을 정의하기 위하여 사용되었습니다. 이것은 마크업으로 완전한 URL을 하드코드 해야하는 것으로 부터 당신을 구해줍니다. 그리고 당신이 이 링크에서 변화를 요청하는 것 없이 후에 URL 구조를 바꿀 수 있게 합니다.

더 쉽게 라우트를 정의하게 되면서, 이 마크업은 다음의 URL을 발생합니다.

http://localhost/search/scott

ASP.NET은 자동적으로 인풋 파라미터에 기반해서 올바른 라우트(즉, 올바른 URL을 발생합니다)로 동작합니다. 당신은 또한 표현 안에 라우트 이름을 포함 할 수 있습니다. 그것은 사용할 라우트를 명시하게 합니다.

다음의 예는 RouteValue 표현을 사용하는 법을 보여줍니다. 

<asp:Label ID="Label1" runat="server" Text="<%$RouteValue:SearchTem%>" />

이 컨트롤을 포함한 페이지가 동작할 때, 레이블은 "scott"이라는 값을 표시합니다.

RouteValue 표현은 마크업 안의 라우트 데이터 사용을 아주 쉽게 만들고, 그것은 마크업안의 더 복잡한 Page.RouteData["x"] 문법과 함께 동작해야 하는 것을 피할 수 있습니다.

Using Route Data for Data Source Control Parameters

RouteParameter 클래스는 당신이 데이터 소스 컨트롤 안의 쿼리를 위한 파라미터 값으로 라우트 데이터를 상세화하게 합니다. 다음의 예에서 보여지듯이, 그것이 FormParameter 처럼 잘 작동합니다:

<asp:sqldatasource id="SqlDataSource1" runat="server"
    connectionstring="<%$ ConnectionStrings:MyNorthwind %>"
    selectcommand="SELECT CompanyName,ShipperID FROM Shippers where
      CompanyName=@companyname"
  <selectparameters>
    <asp:routeparameter name="companyname" RouteKey="searchterm" />
  </selectparameters>
</asp:sqldatasource> 


 이 경우에, 라우트 파라미터 searchterm의 값은 Select 구문의 안에 @companyname 파라미터를 위하여 사용 될 것입니다다.