다음을 통해 공유


와일드카드 스크립트 매핑 및 IIS 7 통합 파이프라인

작성자 : Ruslan Yakushev

IIS 7 이상의 통합 요청 처리 파이프라인의 가장 큰 이점은 웹 사이트의 모든 콘텐츠 유형에 유용하고 유용한 ASP.NET 기능을 모두 사용할 수 있다는 점입니다. ASP.NET 특정 콘텐츠에 대한 것이 아닙니다. 예를 들어 ASP.NET SQL 기반 멤버 자격을 사용하여 정적 파일 및 폴더를 보호할 수 있습니다. 또한 IHttpHandlerIHttpModule과 같은 ASP.NET 확장성 API를 사용하여 non-ASP.NET 콘텐츠에 대해서도 실행될 사용자 지정 모듈 및 처리기를 추가할 수 있습니다.

IIS 6에는 이러한 수준의 통합이 없습니다. ASP.NET ISAPI 확장으로 IIS 6에 연결되었고 기본적으로 해당 확장에 매핑된 요청만 처리하도록 구성되었습니다. 예를 들어 ".aspx"로 끝난 요청은 ASP.NET 확장에서 처리됩니다. 이것은 분명히 웹 사이트에서 다른 모든 경쟁에 대한 ASP.NET 기능을 사용할 수 있기를 원하는 고객에게 큰 제한이었습니다. 가장 일반적인 해결 방법은 "와일드카드 스크립트 매핑"을 사용하는 것이었습니다. 이 게시물에서는 IIS 6에서 와일드카드 스크립트 매핑을 사용한 애플리케이션을 IIS 7 이상으로 마이그레이션하는 방법을 설명합니다.

와일드카드 스크립트 매핑을 사용하여 모든 요청을 처리하도록 IIS 6에서 ASP.NET 구성했다고 가정합니다. 예를 들어 URL 재작성을 위한 ASP.NET 모듈이 있었고 이 모듈에서 확장 없는 URL을 처리하려고 했습니다.

이 와일드카드 스크립트 맵 구성은 일반적으로 웹 서버 또는 웹 사이트에 대한 속성 대화 상자를 열고 홈 디렉터리 탭을 선택한 다음 구성 단추를 클릭한 다음 "와일드카드 애플리케이션 맵"에 대한 삽입 단추를 클릭하여 IIS 6 관리자 내에서 수행됩니다.

애플리케이션 구성 대화 상자 및 애플리케이션 확장 매핑 추가 및 편집 대화 상자의 스크린샷 애플리케이션 구성 대화 상자의 삽입 단추가 강조 표시되어 있습니다.

이제 애플리케이션을 IIS 7 이상으로 이동할 때 ASP.NET 동일한 동작을 수행하도록 구성하려고 합니다. 이 작업을 수행하는 방법에는 클래식 파이프라인 모드 사용 또는 통합 파이프라인 모드 사용의 두 가지 옵션이 있습니다.

IIS 7 이상의 클래식 파이프라인 모드에서 와일드카드 스크립트 매핑

클래식 파이프라인 모드에서 ASP.NET IIS 요청 처리 파이프라인에 ISAPI 확장으로 연결됩니다( IIS 6과 정확히 동일한 방식). 실제로 파일을 열고 %WINDIR%\system32\inetsrv\config\applicationHost.config 그 안에 있는 섹션을 <handlers> 찾으면 IIS가 ASP.NET 특정 요청을 aspnet_isapi.dll매핑하도록 구성된 방법을 확인할 수 있습니다.

<handlers accessPolicy="Read, Script">
  ...
  <add name="PageHandlerFactory-ISAPI-2.0" 
       path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
       modules="IsapiModule" 
       scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" 
       preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
  ...
</handlers>

처리기 매핑에 대한 preCondition 특성을 확인합니다. 무엇보다도 이 특성은 classicMode로 설정되므로 애플리케이션 풀이 클래식 모드에서 실행되도록 구성된 경우에만 이 처리기 매핑이 적용됩니다.

이제 클래식 모드에서 실행되는 ASP.NET 대한 와일드카드 매핑을 구성하려는 경우 IIS 관리자에서 "처리기 매핑"을 선택하고 "와일드카드 스크립트 맵 추가..."를 클릭하여 이 작업을 수행할 수 있습니다. 작업.

와일드카드 스크립트 맵 추가 대화 상자 및 처리기 매핑 페이지의 스크린샷 처리기 매핑 페이지의 오른쪽에 있는 작업 창에서 Wilcard 스크립트 맵 추가가 강조 표시됩니다.

실행 파일로 aspnet_isapi.dll 선택하고 이 스크립트 매핑에 ASP.NET-ISAPI-2.0-와일드카드와 같은 의미 있는 이름을 지정합니다. 그런 다음 확인을 클릭한 다음 "와일드카드 스크립트 맵 추가" 대화 상자에서 예를 클릭합니다.

와일드카드 스크립트 맵 추가 대화 상자 및 와일드카드 스크립트 맵 추가 대화 상자의 스크린샷 와일드카드 스크립트 맵 추가 대화 상자에서 예, 아니요 및 취소 옵션이 표시됩니다.

다음으로, "순서가 지정된 목록 보기..."를 클릭하여 처리기 매핑에 대한 순서가 지정된 목록 보기로 전환합니다. 작업을 수행하고 새로 만든 매핑을 StaticFile 처리기 매핑 바로 앞의 목록 맨 아래로 이동합니다.

처리기 매핑 기능 페이지의 스크린샷 처리기 매핑 목록 보기의 맨 아래에는 OPTIONS 동사 처리기, SP 점 NET 대시 I SS AP 대시 2개 점 0 대시 와일드카드 및 정적 파일이 모두 강조 표시됩니다.

web.config 파일을 열고 섹션을 <handlers> 살펴보면 ASP.NET 대한 와일드카드 스크립트 맵이 StaticFile 처리기 바로 앞에 있는 것을 볼 수 있습니다.

<handlers accessPolicy="Read, Script">
  ...
  <add name="ASP.NET-ISAPI-2.0-Wildcard"
     path="*" verb="GET,HEAD,POST,DEBUG"
     modules="IsapiModule"
     scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll"
     preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
  <add name="StaticFile" 
     path="*" verb="*" 
     modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
     resourceType="Either" requireAccess="Read" />
</handlers>

와일드카드 처리기 매핑의 상대 순서가 중요합니다. "StaticFile" 처리기 매핑 후에 이 처리기 매핑을 정의하면 "StaticFile"이 모든 요청을 처리하고 ASP.NET 와일드카드 처리기에 대한 요청이 제공되지 않습니다.

이미 알고 있는 것처럼 IIS 7 이상에서 ASP.NET 와일드카드 처리기 매핑에는 IIS 6에 있는 것과 동일한 성능 제한이 적용됩니다. 이러한 종류의 처리기 매핑의 문제는 정적 파일에 대한 요청을 포함하여 모든 요청이 처리된다는 것입니다. ASP.NET 정적 파일 처리기는 네이티브 IIS 정적 파일 처리기만큼 강력하지 않습니다. 또한 ASP.NET 제공하는 정적 파일은 서버에서 캐시되지 않으며 웹 브라우저에서도 캐시되지 않습니다. 이러한 성능 제한 때문에 IIS 7 이상 통합 파이프라인을 사용하여 IIS 6의 와일드카드 매핑과 동일한 기능을 달성하는 것이 좋습니다.

와일드카드 스크립트 매핑 대신 IIS 7 이상 통합 파이프라인

통합 파이프라인을 사용하면 ASP.NET 기능이 IIS의 기본 요청 처리에 완전히 통합되므로 모든 유형의 요청에 모든 ASP.NET 기능을 사용할 수 있습니다. 이렇게 하면 와일드카드 처리기 매핑이 필요하지 않습니다. 이제 기존 ASP.NET 모듈을 사용하고 모든 요청에 적용할 수 있습니다.

예를 들어 ASP.NET 작성된 URL 재작성 모듈이 있다고 가정해 보겠습니다. IIS 6에서 이 모듈은 아래와 같이 web.config 파일의 <system.web> 섹션 내부에 등록되었습니다.

<system.Web>
  <httpModules>
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" />
    ...
  </httpModules>
</system.Web>

IIS 6에서 이 모듈은 관리되는 콘텐츠에 대한 요청에 대해서만 실행되었으므로 과 같은 http://example.com/archive/2008/08/26/post-title.aspx.aspx 확장이 있는 URL에 대해서만 작동했습니다. 확장 없는 URL을 처리하려면 ASP.NET 대한 와일드카드 스크립트 매핑을 구성해야 했습니다. IIS 7 이상의 통합 파이프라인을 사용하면 더 이상 그렇게 할 필요가 없습니다. 이 모듈을 확장 없는 URL에 적용하려면 아래와 같이 web.config 파일 내의 섹션 내에 <system.webServer> 등록해야 합니다.

<system.webServer>
  <modules >
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" 
         preCondition="" />
    ...
  </modules>
<system.webServer>

ASP.NET 특정 콘텐츠에 대한 요청뿐만 아니라 모든 요청에 대해 모듈이 실행되도록 적용하므로 preCondition 특성을 비워 두어야 합니다.

이러한 방식으로 관리되는 모듈을 등록해도 와일드카드 스크립트 매핑을 사용할 때처럼 성능에 큰 영향을 미치지 않습니다. 웹 애플리케이션에 대한 모든 요청에 대해 모듈이 호출되더라도 모든 기존 처리기 매핑이 계속 적용되므로 정적 파일은 네이티브 IIS 정적 파일 처리기에서 계속 제공됩니다. 이러한 방식으로 모듈을 등록하는 또 다른 이점은 이제 PHP, ASP 또는 기타 동적 페이지에 대한 요청에 적용할 수 있다는 것입니다. 와일드카드 스크립트 매핑을 사용하는 경우 이 작업을 수행할 수 없습니다.

여기서 멘션 마지막 한 가지는 runAllManagedModulesForAllRequests라는 섹션에서 특성을 <modules> 사용할 수도 있다는 것입니다.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="True" >
    ...
    <add name="MyUrlRewrite" 
         type="SomeNamespace.MyModules.UrlRewrite, SomeNamespace.MyModules" 
         preCondition="ManagedHandler" />
    ...
  </modules>
<system.webServer>

이 특성은 IIS가 preCondition="managedHandler" 특성을 무시하도록 강제하므로 웹 애플리케이션에 대한 모든 요청에 대해 모든 관리되는 모듈이 호출됩니다.