2010-01-12 5 views
0

나는System.Web.Routing을 사용하여 Web Forms에서 URL을 다시 쓰지 않는 방법?

코드는 다음과 같습니다.

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.Add("CampaignRoute", new Route 
            (
            "{campaign_code}", 
            new CustomRouteHandler("~/default.aspx") 
            )); 
} 

IRouteHandler 구현 :

public class CustomRouteHandler : IRouteHandler 
{ 
    public CustomRouteHandler(string virtualPath) 
    { 
     VirtualPath = virtualPath; 
    } 

    public string VirtualPath { get; private set; } 

    public IHttpHandler GetHttpHandler(RequestContext 
      requestContext) 
    { 
     if (requestContext.RouteData.Values.ContainsKey("campaign_code")) 
     { 
      var code = requestContext.RouteData.Values["campaign_code"].ToString(); 

      HttpContext.Current.RewritePath(
       string.Concat(
        VirtualPath, 
        "?campaign=" + code)); 
     } 

     var page = BuildManager.CreateInstanceFromVirtualPath 
         (VirtualPath, typeof(Page)) as IHttpHandler; 

     return page; 
    } 

그러나 내 기존 영문 페이지에 변경하는 너무 많은 것들이 있습니다 발견 (즉, 자바 스크립트 링크, CSS 파일 링크). 위의 코드 그러나 결국이 아닌 재 작성 단지 필요한 변경을 최소화하기 위해 Request.Redirect 또는 Server.Transfer를을 유지하는 방법이 경우

  1. 그래서 나는 생각하고있다. 따라서 System.Web.Routing을 사용하는 목적은 전적으로 첫 번째 항목의 URL에 적합하게됩니다.

  2. 코드에서 특정 된 것 이외의 나머지 패턴을 무시하는 방법은 무엇입니까?

감사합니다.

답변

1

ASP.NET URL 라우팅의 일부 구현은 내부적으로 다시 쓰기를 사용하기 때문에 (ASP.NET 버전에 따라 다름) ASP.NET URL 라우팅과 함께 다시 쓰기를 사용하지 않는 것이 좋습니다. 다시 쓰기를 사용하는 두 개의 다른 구성 요소를 조합하면 충돌이 발생할 수 있습니다 (그러나이 문제가 발생하는 이유는 100 % 확신 할 수는 없지만).

사용에 관한 전송/재 작성/리디렉션 :

나의 강력한 추천이 그들 중 하나를 사용하지 않는 것! 리다이렉트 (또는 다른 것) 대신 IReweHandler에서 반환하는 방식으로 페이지를 ASP.NET에서 직접 호출 할 수 있습니다 (이미 재 작성 호출없이). IRouteHandlerRouteData을 저장하는 한, 페이지는 경로에서 데이터를 가져올 수 있으므로 잘 보내야합니다.

경로 데이터를 저장하는 방법에 대한 예를 보려면 Phil Haack's Web Form routing sample을 살펴보십시오 (또는 그의 코드를 사용하십시오!).

에 대해서는 무시 패턴 : 당신은 당신의 경로와 일치하는 URL을 제한하는 IRouteConstraint를 사용할 수 있습니다

. 정규식을 사용하는 내장 된 기본 라우트 제약 조건 구현이 있지만 맞춤 라우트 제약 조건을 작성할 수도 있습니다. 다음은 그 예이다 :

Route r = new Route(...); 
r.Constraints = new RouteValueDictionary(new { 
    campaign_code = "\d{5}", // constrain to 5-digit numbers only 
    other_value = new CustomRouteConstraint(), // call custom constraint 
}); 

CustomRouteConstraint는 그 IRouteConstraint에서 파생 쓸 수있는 클래스입니다.

CSS 및 JPG 파일과 같은 정적 파일에 대해 유의해야 할 것은 기본적으로 항상 라우팅에서 제외된다는 것입니다. 기본적으로 라우팅은 디스크의 실제 파일과 정확히 일치하는 패턴을 무시합니다. RouteTable.Routes.RouteExistingFiles = true을 설정하여이 동작을 변경할 수 있지만 기본값은 아닙니다.

+0

URL 재 작성과 URL 라우팅의 차이점은 무엇입니까? 미안 내가 여기서 바보가된다. 그러나 나는 정말로 모른다. – Jeff

+0

ASP.NET 의미에서 URL 다시 쓰기는 ASP.NET에서 사용중인 내부 URL을 변경하여 현재 요청이 처리되는 방식을 변경할 수있는 중간 단계입니다. URL 라우팅은 IHttpHandler에 직접 요청을 매핑하여 URL 다시 쓰기를 사용할 필요가없는 새로운 기능입니다. – Eilon

관련 문제