재우니의 블로그

 

haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx/

 

ASP.NET MVC on IIS 6 Walkthrough

UPDATE: If you run ASP.NET MVC on IIS 6 with ASP.NET 4, setting up extensionless URLs just got easier. In most cases, it should just work.

haacked.com

 

업데이트 : ASP.NET 4  설치된 IIS 6에서 ASP.NET MVC를 실행하면 확장명이 없는 URL 설정이 쉬워졌습니다. 대부분의 경우 작동합니다. 이 부분에 대해 궁금한 점은 아래 블로그 참고하세요.

 

ASP.NET MVC 3 Extensionless URLs on IIS 6

haacked.com/archive/2010/12/22/asp-net-mvc-3-extensionless-urls-on-iis-6.aspx/

 

ASP.NET MVC 3 Extensionless URLs on IIS 6

A lot has been written about how to get ASP.NET MVC running on IIS 6 with extensionless URLs. Up until now, the story hasn’t been very pretty. When running ASP.NET MVC on ASP.NET 4, it gets a lot easier.

haacked.com

 

사람들이 ASP.NET MVC 를 IIS 6에서 실행하는 데 문제가 있다는 많은 보고서를 보았습니다 . 때때로 문제는 매우 사소한 구성 오류이고, 때로는 IIS 6의 작동 방식에 대한 오해입니다.

이 게시물에서는 IIS 6에서 ASP.NET MVC를 실행하는 방법에 대한 확실한 가이드를 제공하고 싶습니다. 먼저 URL에 대해 .mvc 또는 .aspx 파일 확장명을 사용하는 방법을 살펴본 다음 확장명이 없는 URL 을 사용하여 살펴 보겠습니다 .

IIS 6 및 ASP.NET MVC에 문제가있는 경우 .mvc 또는 .aspx 매핑 사용에 관심이 없더라도이 게시물의 모든 단계를 수행하는 것이 좋습니다 . 여기서 배운 교훈 중 일부는 ASP.NET MVC와 관련된 것보다 ASP.NET 자체가 IIS 6에서 작동하는 방식과 더 관련이 있습니다.

 

초기 설정

 

이 작업을 쉽게하려면 Visual Studio를 시작하고 IIS 6이 설치된 컴퓨터 에서 새 ASP.NET MVC 웹 응용 프로그램 프로젝트  만듭니다. IIS 6 컴퓨터가 다른 컴퓨터에 있는 경우이 단계를 건너 뛸 수 있습니다. 나중에 시스템에 사이트를 배포 할 수 있습니다.

프로젝트를 만든 후 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택 합니다. 프로젝트 속성 편집기가 열립니다.  탭을 선택하고 IIS 웹 서버 사용을 선택합니다 . 전체 크기로 보려면 이미지를 클릭하십시오.

 

프로젝트 속성 편집기

 

프로젝트 URL에서 Iis6DemoWeb 이라는 가상 애플리케이션 이름을 지정한 다음 Create Virtual Directory 를 선택했습니다 . 대화 상자가 나타나고 이제 기본 웹 사이트 아래에 IIS 가상 응용 프로그램이 있어야합니다 (이는 기어 모양 아이콘으로 표시되는 가상 디렉터리와 다릅니다).

IIS 6 가상 웹 응용 프로그램

 

URL 파일 확장자 사용

 

ASP.NET MVC 설치 관리자를 실행하면 IIS 6에서 ISAPI 매핑을 설정하여 .mvc extension  aspnet_isapi.dll 에 매핑합니다 . 이는 IIS가 .mvc 파일 확장명을 사용하는 요청을 ASP.NET 으로 전달 하기 위해 필요합니다 .

확장명이 없는 URL을 사용할 계획이라면이 이번 섹션을 건너 뛸 수 있지만, 확장명이 없는 URL을 설정할 때 알아야 할 몇 가지 정보가 있으므로 어쨌든 읽는 것이 유용 할 수 있습니다.

 

.mvc를 ASP.NET에 매핑

 

.mvc URL 확장 을 사용하고 ASP.NET MVC가 설치되지 않은 컴퓨터에서 IIS 6에 배포하려는 경우 다음 단계를 수행하여이 매핑을 만들어야합니다.

.mvc 대신에 .aspx 확장자를 사용하면 좋은게 하나 있는데 그것은 .aspx 확장자에 대해 매핑하는 부분에 대해서 걱정할 필요가 없다는 것입니다. 이는 machine 상에 아마도 asp.net 이 설치되면서 이미 매핑 해 두었기 때문입니다.

나머지는 가상 애플리케이션 노드 ( 이 경우 IIS6DemoWeb)  마우스 오른쪽 버튼으로 클릭 하고 속성을 선택 합니다. 다음 대화 상자가 표시되어야합니다.

웹 사이트 속성

 

Virtual Directory  에 있는지 확인 하고 Configuration을 선택 합니다. 루트 웹 사이트에서이 변경을 수행하도록 선택할 수도 있습니다. 이 경우 찾고 있는 탭은 가상 디렉토리가 아닌  디렉토리 입니다.

이것은 나타납니다 응용 프로그램 구성 ISAPI 매핑의 목록을 표시 대화 상자를. 아래로 스크롤하여 .mvc가 목록에 있는지 확인합니다.

응용 프로그램 매핑

 

스크린 샷에서 .mvc 가 목록에 있음을 알 수 있습니다 . 컴퓨터의 목록에 존재한 경우, 다음 섹션으로 건너 뛸 수 있습니다. 목록에 없는 경우 목록에 추가 하겠습니다. 먼저 aspnet_isapi.dll 의 경로를 알아야합니다. 내 컴퓨터에서는 다음과 같습니다.

c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

 

컴퓨터에 따라 다를 수 있습니다. 쉽게 찾을 수 있는 한 가지 방법은 목록에서 .aspx 확장명을 찾아 두 번 클릭하여 매핑 대화 상자를 표시하는 것입니다.

 

 

확장 매핑

 

이제 실행 파일 텍스트 상자 의 경로를 클립 보드로 복사 할 수 있습니다 . .mvc를 매핑 할 경로입니다.

취소를 클릭하여 애플리케이션 구성 대화 상자 로 돌아간 다음 추가 를 클릭 하면 빈 애플리케이션 확장 매핑 추가 / 편집 대화 상자가 나타납니다 .

확장자가 따옴표없이 " .mvc " 여야한다는 점을 제외하고 .aspx에 대해 본 것과 정확히 동일한 값으로 필드를  웁니다 . 확인을 클릭 하면 매핑이 완료됩니다.

 

확장자가 있는 경로 지정

 

응용 프로그램을 실행하기 전에 .mvc 또는 .aspx 확장명을 선택하여 선택한 파일 확장명을 찾기 위해 기본 route 를 업데이트 해야합니다 . 

.mvc 확장자를 사용하기 위해 Global.asax.cs 파일을 찾아 RegisterRoutes 메소드를 찾습니다. 만약에 .aspx 확장자를 사용하고자 한다면 아래 코드 중에 {controller}.mvc{controller}.aspx 으로 변경하시면됩니다.

 

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute(
    "Default",
    "{controller}.mvc/{action}/{id}",
    new { action = "Index", id = "" }
  );

  routes.MapRoute(
    "Root",
    "",
    new { controller = "Home", action = "Index", id = "" }
  );
}

 

위의 코드를 설명하자면, 두 번째 route 인 "Default"에는 URL 세그먼트의 일부에 literal 확장자를 가지고  있으므로, application root 에 대한 요청과 일치 할 수 없습니다. 그래서 application root 에 대한 요청과 일치 할 수있는 "Root"라는 세 번째 route 가 있습니다.

이제 CTRL + F5 (또는 내 웹 사이트 탐색)를 누르면 다음 홈 페이지가 표시됩니다.

 

홈 페이지

 

그리고 페이지에 대해.

페이지 정보

 

URL에는 .mvc 확장자가 포함되어 있습니다 .

어, 휴스턴! 문제가있다

물론 프로젝트의 웹 루트로 이동할 수 있기를 원할 것입니다. / Iis6DemoWeb으로 이동하면 어떤 일이 발생하는지 확인하십시오 .

루트 홈 페이지

 

이것은 이 연습을 작성하면서 발견 한 기본 템플릿에 포함 된 Default.aspx.cs 파일 의 버그입니다 . 즉시 수정 해 드리겠습니다. 매우 쉽기 때문에 여기에서 수정 해 드릴 수 있습니다.

참고 :  root 를 요청 할 때 "파일을 찾을 수 없음" 오류가 발생하면 Default.aspx 가 기본 문서로 매핑되지 않았을 수 있습니다. 따라서 Default.aspx 를 기본 문서로 추가하시면 됩니다.

한편, 수정 사항은 다음과 같이 변경하는 것입니다.

변경 전:

HttpContext.Current.RewritePath(Request.ApplicationPath);

변경 후 : 

HttpContext.Current.RewritePath(Request.ApplicationPath, false);

 

가상 응용 프로그램이 아닌 IIS root 에서 웹 사이트를 만든 경우 이 문제를 발견하지 못했을 것입니다. 그러나 가상 애플리케이션(virtual application) 에서 렌더링 된 stylesheet 의 URL 에는 가상 애플리케이션 이름이 포함되어 있어서는 안됩니다. 두 번째 인수를 false 로 변경하면이 문제가 해결됩니다.

 

IIS6 확장명이 없는 URL

 

이제 우리는 IIS 6 의 악명 높은 "Star mapping" 또는 " 와일드 카드 매핑 "기능을 사용하여 extension-less URLs 로 이 작업을 합니다 . 이렇게 하면 성능에 미치는 영향에 대해 많은 우려가 있기 때문에 악명 높은 것 같습니다. 물론 사이트의 성능을 직접 측정하여 실제로 문제가 있는지 확인해야합니다.

첫 번째 단계는 .mvc ISAPI 매핑을 구성 할 때했던 것처럼 Application Configuration Properties 대화 상자 로 돌아가는 것입니다 (나중에 정보가 유용 할 수 있다고 설명했습니다 ).

응용 프로그램 매핑

 

와일드 카드 애플리케이션 맵 섹션 옆에있는 insert 버튼을 클릭 합니다.

와일드 카드 확장 매핑

 

그러면 와일드 카드 응용 프로그램 매핑 대화 상자가 나타납니다. aspnet_isapi.dll 경로를 입력합니다 . 이 경로를 얻기 위해 앞서 언급 한 트릭을 따를 수 있습니다.

파일이 있는지 확인 확인란 을 선택 취소하는 것을 잊지 마십시오 ! 이것은 사람들이 저지르는 가장 흔한 실수 중 하나입니다.

이 게시물의 모든 내용을 따라왔다면 돌아가서 Global.asax.cs 파일의 경로를 기본 경로로 재설정해야합니다 . 이제 경로에 더 이상 .mvc 파일 확장자가 필요하지 않습니다 . 이 시점에서 원하는 경우 Default.aspx 를 제거 할 수도 있습니다 . 더 이상 필요하지 않거덩요.

이제 사이트를 탐색 할 때 다음 스크린 샷에서 볼 수 있듯이 URL에 파일 확장자가 없습니다.

확장이없는 홈페이지

확장이없는 페이지 정보

 

마지막 팁

 

이해해야 할 한 가지는 ASP.NET 프로젝트의 범위가 해당 프로젝트가 있는 Website  또는 Virtual Application 으로 지정된다는 것입니다. 예를 들어 여기에 있는 예에서 IIS6DemoWeb 이라는 Virtual Application 을 ASP.NET MVC 웹 응용 프로그램이 포함 된 directory  가리 켰 습니다.

 

따라서 해당 virtual application 에 대한 요청 만 web application 에서 처리됩니다. 이 경우 http://localhost/  대한 요청을 할 수 없으며 web application 에서 처리 할 것으로 기대합니다. 이 응용 프로그램의 라우팅이 http://localhost/not-my-app/ 과 같은 다른 루트 디렉토리에 대한 요청을 처리 할 것으로 기대할 수도 없습니다 .

 

여기에서 수행 한 예제에서는 데모 목적으로  virtual application 을 사용했습니다. IIS의 root Website 를 내 응용 프로그램으로 지정하고 가상 응용 프로그램이 아닌 http://localhost/ 에서 실행하는 것은 매우 쉽습니다. 이것은 문제가 되지 않습니다. 도움이 되었기를 바랍니다.