2012-04-20 5 views
7

일부 레거시 URL을 지원하고 컨트롤러 작업에 매핑하려고합니다. URL은 다음과 같이 : 내 컨트롤러는 그들과 거래를하는특수 문자가있는 MVC 경로

여기
routes.MapRoute(
    "LegacyCategory", 
    "{path}.html", 
    new { controller = "LegacyCI", action = "Index", } 
); 

는 (의 시작을)입니다 :

public class LegacyCIController : Controller { 
    public ActionResult Index(string path) { 
     if (path == "~Address+Labels") { 
      return RedirectToAction("Display", "Category", new { id = "AddressLabels" }); 
     }  
     return RedirectToAction("Index", "Category"); 
    } 
} 

난에 중단 점을 설정하면 다음

/~Home+Office~Note+Pads.html 

내 경로입니다 LegacyCIController에서 시작 페이지를 XXX.html로 설정하면 중단 점이 발생하고 ( if은 실패합니다.) 수명이 좋습니다. 그러나 시작 페이지를 ~Address+Labels.html으로 설정하려고 할 때 중단 점이 발생하지 않고 Chrome에서 "oops,이 페이지가 손상된 것으로 보입니다"라는 페이지가 표시됩니다.

Visual Studio가 아닌 내 컴퓨터에서 IIS 7을 통해이 페이지를 실행하고 있습니다.

이 URL은 일반 MVC 경로가 처리 할 수없는 형식이 잘못 되었나요? 아니면 내가 잘못된 것이 있습니까?

+6

와우, 그거 예쁜 파일 이름이야. – Tejs

+0

@Tejs - 예, 가능합니다. 레거시 물건 다루는 것은 삶의 진정한 기쁨 중 하나입니다 :) –

+0

내 이론은 IIS가 요청을 수신 거부하는 것입니다. IIS7에 블랙리스트 URL 문자 집합이 있다고 생각합니다. – Tejs

답변

5

경로에 +와 기본 IIS7 URL을 차단합니다 (오류 404.11)함으로써, 당신은 web.configallowDoubleEscaping을 설정하여이 메소드를 오버라이드 (override) 할 수 있습니다

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"> 
     </requestFiltering> 
    </security> 
    </system.webServer> 

을하지만,에 설명 된대로 그것을 사용하는 동안이 옵션 잠재적 인 보안 구멍을 여는 IIS 블로그, 그래서 약간주의 :

http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx

+0

다시 한 번 감사드립니다. 그것은 완벽하게 작동했습니다. –

0

HandleUnknownAction을 사용해보세요. 컨트롤러에서 :

protected override void HandleUnknownAction(string actionName) { 
    if(Request.Path == "/~Address+Labels.html") { 
    RedirectToAction("Display", "Category").ExecuteResult(ControllerContext); 
    } else { 
    base.HandleUnknownAction(actionName); 
    } 
} 
관련 문제