2013-06-10 2 views
1

ASP.NET MVC3에서 일부 이상한 동작이 발생합니다. 기본적으로 BeginRequest에서 발생하는 HttpModule을 작성하여 HttpContext.RewritePath(string)을 사용하여 내 URL을 다시 쓸 수 있습니다. 대부분의 경우 제대로 작동하지만 URL에 공백이 있으면 ASP.NET MVC가 다시 쓰일 때 다르게 동작합니다.MVC3 사용자 지정 URL Rewriter HttpModule RouteData 손상

예 URL은 :

http://www.mysite.com/my%20url 

내 라이터는이 그룹을 캡처하고 재 작성에 그 캡처 그룹을 사용할 수 헬리 유사한 정규식으로 설정되어 있습니다. 예 규칙은 다음과 같은 http://www.mysite.com/my%20url?test < http://www.mysite.com/my%20url에 관한

<add original="^/(.*)\?test$" rewritten="/$1" /> 

이것은 URL을 다시 것 - 쿼리 문자열이 사라집니다 있습니다. 이 기능은 올바르게 작동합니다.

내 MVC 라우팅은 "navstate"키 아래의 RouteData 값에 매핑하기 위해 와일드 카드로 my%20url 부분을 캡처하도록 설정됩니다.

"{*navstate}" 

그래서, 나는 다시하지 않을 때, 내 RouteDataDictionary 포함 : 같은 규칙 보이는 내가 다시 수행 할 때

key: "navstate" value: "my url" 

, 내 RouteDataDictionary에는 다음이 포함

key: "navstate" value: "my%20url" 

주를이 그것은 URL을 디코딩하지 못했습니다. RouteData 변수를 디코드하십시오.

누구에게이 아이디어가 있습니까? 차이점을 만드는 유일한 방법은 내 HttpModule에서 HttpContext.RewritePath(string)을 사용하는 것입니다. 모듈을 끄면 적절한 기능이 보장됩니다. HttpUtility.UrlDecode(string)을 사용하여 다시 쓰기 호출 전에 URL을 수동으로 해독하면 작동하지만 해킹처럼 느껴집니다.

편집 :

이되지 MVC 버그 것 같다,하지만 ASP.NET 라우팅과 함께, 그래서 같은 태그를 업데이트했습니다.

답변

2

나는 이것에 관해 점검했다. 나는 생각했다. URL 재 작성 및 라우팅은 동일한 요청에서 함께 사용하도록 설계되지 않았습니다. 라우팅을 URL 재 작성의 특수한 형태로 생각하면 두 가지가 서로 방해됩니다.

나는 예상대로 작동하지 않기 때문에 버그라고 느낀다는 것을 알고있다. 그러나 이것은 정확히 예상대로 작동하고있다. 파이프 라인과 모듈이 들어올 때 라우팅 모듈이 이미 수행 한 작업을 생각해보십시오. 상황이 순서대로 일어나야하므로 디코딩이 발생하고 URL 재 작성이 발생합니다.

+0

충분히 정교합니다. Decode가 BeginRequest 이벤트보다 먼저 발생했다면 재 작성된 URL을 다시 디코딩해야한다는 것을 이해할 수 있습니다. 감사합니다 스콧 - 정말 연구와 후속 감사드립니다. 라우팅 어셈블리의 향후 빌드에서 RouteDataDictionary 할당에 대한 디코드를 강요하는 것이 가치가 있습니까? – Haney