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