- Posted by zmeun on 2009. 05. 26 18:04
VirtualPathProvider를 이용한 프로젝트의 배포
일단 글을 시작하기에 앞서 살짝 쑥스런 웃음 한번 짖고 가겠습니다. 냐햐햐햐 ^^;;. 그간 전혀 활동이 없었던 무책임함을 어떻게든 무마시키고 싶은.. 나름의 수작 이었습니다.. ^^:
그간 새로운 환경에 적응도 하고 게으름도 부리고 개인적인 사정도 있고 하여, 종적을 감추며 살고 있었습니다. 그래도 사이사이에 계속 불편한 마음을 갖고 있었던 것은 사실입니다. 그리웠기도 했구요. 암튼! 나머지는 각설하고, 그간 포스팅 주제를 몇 가지 생각해 놓은 게 있었는데.. 팽팽 놀고 있는 사이 워낙 감(感)이 떨어진 터라.. 글쎄요… 얼마나 도움이 될지는 모르겠습니다. 뭐 그렇다 하더라도, 제가 겪은 경험을 기록하는 차원에서 몇 자 적어볼까 합니다.
이전에 웹지니님께서 VirtualPathProvider라는 주제로 포스팅을 올리신 게 있습니다. 내용은 대략 VirtualPathProvider를 사용해서 가상화 경로를 지원하는 코드를 구현하는 방법을 소개하는 것이었습니다. 이번 글은 어쩌면 이 글의 후속편이 될 수도 있을 것 같습니다. 계획하려고 했던 건 아닌데.. 우연히 내용의 줄기가 그렇게 연결될 수 있을 것 같습니다.
음. 그럼 웹지니님께서 소개한 내용을 토대로 가상화 경로를 지원하는 웹 애플리케이션을 구현했다고 가정해 보겠습니다. 그 다음은 당연 배포가 이루어져야겠지요. 그래.. 배포! 뭐 하루 이틀 하는 것도 아니고, 그게 뭐 문제가 될까?. 솔직히 문제가 될 일은 없습니다. 다만 예상치 못했던 오류를 발견함으로 인해서 살짝 당황하는 상황 정도일 테니까요.
그럼 그 당황스런 오류가 무엇인지 한번 보겠습니다. 구현한 웹 애플리케이션을 배포하고 일반적인 케이스의 IIS 설정을 마친 후에 url을 호출해 봅니다.
순간 배신감을 느끼듯이, 그렇게 친했던 IIS가 나에게 이런 오류를 던져버립니다. 이런 상황에서 당황하지 않을 수 없겠죠.(혹시… 저만 그.. 런.. 건…가요? -_-;;)
IIS가 나에게 이런 배신을 때리는 이유가 있습니다. IIS를 잘 아시는 분들은 IIS의 심경 역시 잘 이해하고 계실 텐데요.. IIS의 설정 부분을 유심히 보시면 홈 디렉토리 > 구성 창에 아래와 같은 부분이 있습니다.
다들 아시는 것과 같이 IIS로 요청되는 경로의 리소스 확장자를 매핑하는 부분입니다. 대게는 이미 설정되어 있는 대로 사용하기 때문에, 굳이 여기에 어떤 작업을 필요로 하지 않죠. 하지만, VirtualPathProvider를 사용한 경우에는 다릅니다. 왜냐하면 이 경우에는 가상경로를 사용하기 떄문에 어떤 확장자를 사용할지 모르기 때문이죠.
그렇다면, 앞에서 확인한 오류를 해결하려면 어떻게 해야 할까요. 위 그림에서 B영역에 해당하는 부분을 보시면 “Wildcard application maps”이라고 된 부분을 확인 할 수 있는데, 바로 이 부분에서 확장자가 지정되지 않은 경로에 대한 IIS 처리기를 등록하는 곳입니다. 그렇다면, 우리는 도대체 어떤 처리기를 등록해야 할까요? 괜히 이런 것 때문에 고민하지 마세요. 안 그래도 하루하루가 고민들로 가득차 있는데, 이런 것 까지 신경쓰면… 세상 빡빡해 집니다. ^^;
우리는 asp.net 애플리케이션을 개발하고 있고, asp.net에서 가장 흔하게 사용하는 .aspx 페이지가 IIS의 어떤 처리기를 사용하는지를 알면 문제는 금방 해결 되겠죠.
.aspx 확장자에 매핑 된 처리기를 보면 ..\aspnet_isapi.dll가 등록되어 있는 것을 아주 쉽게 확인할 수 있습니다. 그렇다면 저희도 똑같이 저 놈을 한번 등록해 보겠습니다.
짜잔~~ ………………………………… ?? !! -_-;;
네.. 직접 테스트를 해보신 분들은 이런 반응을 보일 것입니다. 뭐냐?~ 너 낚시 한 거냐? 나 붕어 된 거야?... 아닙니다. 절대 그런 거 아닙니다. 오해하지 마세요. (참고로 결과 이미지는 처음에 보여드렸던 오류와 동일하기 때문에 올리지 않았습니다.)
앞에서와 똑 같은 오류가 발생한 것은 이런 경우에 발생할 수 있습니다.
첫 번째. IIS 처리기를 추가 할 때, “Verify that file exists” 그러니까 한글 버전에서는 “파일 있는지 확인” 이렇게 묻는 체크박스에 체크 했을 때.. 오류가 발생할 수 있습니다. 그러니, 이 부분을 unchecked 하셔야 합니다.
그리고 두 번째. 웹 서버의 web.config 파일에 핸들러를 추가하지 않았을 때, 이때 확인해야 할 web.config의 경로는 웹 프로젝트의 web.config가 아니라 시스템 루트에 있는 web.config입니다.
그러니까, 경로는 이와 같이 되겠죠.
>> C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config.
이 파일을 열어 보시면 <httpHandlers>라는 요소 밑에 수 많은 <add> 요소로 IIS에서 처리하는 확장자의 핸들러가 매핑되어 있습니다. 이 중에서 아래 부분을 다음과 같이 수정합니다.
|
<add path="*" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" validate="True" />
|
|
<!—
<add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />
-->
<add path="*" verb="GET,HEAD,POST" type="System.Web.StaticFileHandler" validate="True" />
|
바로 “*” 확장자의 핸들러를 DefaultHattpHandler에서 StaticFileHandler로 변경하는 작업이 필요한 것이죠.
여기까지 설명한 내용들을 모두 설정 하셨다면, 아마 앞에서 요청한 가상경로의 요청은 아마 다음과 같이 정상적으로 나타날 것입니다.
이런 몇 가지의 설정 사항 변경으로 해서, VirtualPathProvider를 사용한 웹 애플리케이션의 배포는 문제 없이 진행 될 수 있습니다.
대게의 상황에서는 VirtualPathProvider를 사용해서 작업 하시는 경우가 없을 것 같아요. 가상 경로는 이것 외에도 ASP.NET MVC나 HttpHandler를 사용해서도 지원 가능하니까요. 하지만 이 내용이 직접적으로 필요 없다 하더라도, IIS에 처리기를 등록한다던가 이런 설정 사항들이 있다는 것을 참고 삼아 알아두시는 것도 나쁘지 않을 것 같네요.
그럼 오늘은 여기까지 해서 마치도록 하겠습니다. 즐거운 주말 보내시길 바래요~~ 비록 비는 오지만... ^o^;; 감사합니다. (_ _)
Posted by zmeun
* 이 글은 zmeun.tistory.com에서도 확인 할 수 있습니다.
이 포스트를 평가해 주세요.
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5