2012-06-29 1 views
17

저는 몇 시간 동안 인터넷 검색을하고 있었지만 실제로 많은 발전을 이루지 못했기 때문에 여기 누군가가 도움이 될 수 있습니다.ASP.NET MVC 경로 : 경로 용 staticfile 처리기를 건너 뜁니다.

제 3 자 구성 요소가 처리 할 특정 경로에 대한 모든 요청을 가져 오려고합니다.

EDIT 그리고 다른 모든 경로에 대한 모든 요청이 정상적으로 작동해야합니다.

는이 같은 와일드 카드 매핑과 경로 처리기를 사용하고 있습니다 :

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

모든 전통적인 경로를 앞으로 올바르게 제 3 자 구성 요소에 잘 전달 핸들러에. 정적 파일 (.html, .txt 등)을 치면 내 처리기 대신 StaticFile 처리기에서 가져 오므로 StaticFile 처리기를 너무 간단하게 설정하려고합니다 (

)

StaticFile 처리기를 해제하지만 MVC 여전히 경로를 선택하지 않습니다.

내 자신의 처리기를 만들고 ASP 요청 스택에 주입하는 것을 선호하지 않으려 고합니다. MVC를 사용하여이 작업을 수행해야하는 것처럼 보일 것입니다.

의견이 있으십니까? 그리고 감사합니다.

답변

14

여기에는 몇 가지 옵션이 있습니다. 당신이 정말로 asp.net 파이프를 통해 실행중인 모든 요청을하려면

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

당신은해야합니다. 정적 핸들러를 우회하는 당신의 필요가 사이트의 하위 집합으로 제한되어있는 경우

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

업데이트

또 다른 옵션은, 특히,에 대한 방법을 고려하여 다음과 같은

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

을 사용하는 것입니다 mvc 사이트에서 가장 정적 인 파일은 몇 개의 잘 알려진 디렉토리에서 처리되지만 더 나은 옵션입니다.

+0

감사합니다. 확실히 시도한 것이지만 다른 모든 경로가 정상적으로 처리되기를 바랍니다. MVC 방식을 사용하지 않는 것처럼 보이기 시작했습니다. MVC 전에 처리기를 추가하고 추가해야합니다. – jmoss

+0

정확하게 무엇을 원하는지 구체적으로 다루지는 않지만, mvc에서 처리하기 위해서는 asp.net 파이프가 모든 적절한 요청을 받아야합니다. –

+0

중요 :''는 통합 모드 파이프 라인을 실행하는 응용 프로그램 풀에만 적용됩니다. 클래식 모드에서 실행되는 앱 풀에서는 작동하지 않습니다. – BenSwayne

2

가장 좋은 해결책은 URL Rewriter을 사용하여 원래 URL의 요청을 MVC 친화적 인 대안으로 프록시하는 것입니다.

예를 들어, 데이터베이스에서 제공된 콘텐츠의 상대 URL을 자동으로로드 할 수 있어야한다고 가정 해보십시오. 액션 방법은 간단합니다 다음

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

그리고 :

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

첫 번째 재 작성 규칙이 포함 된 경로를 방지하는 것입니다

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

그 규칙은 두 MVC 경로를 설정하게됩니다/rel가 재 작성되지 않도록; 그들은 이미 최종 형태입니다. 두 번째 다시 쓰기 규칙은 요청을 리디렉션하지 않고 프록시합니다.

/load/1234/file.xml 

는 요청을 프록 싱 대신 클라이언트 리디렉션 중첩 상대 경로가 잘 작동 할 수 있도록하고

/load/1234/rel?path=file.xml 

된다 (최종 사용자의 비밀 소스를 숨 깁니다.)