Share via


IIS 7.0 개발자를 위한 엔드 투 엔드 확장성 예제

작성자: Saad Ladki

IIS 7 이상은 풍부한 확장성 API를 기반으로 완전히 모듈식 아키텍처로 빌드됩니다. 이를 통해 개발자는 기본 제공 IIS 구성 요소를 손쉽게 추가, 제거 및 교체할 수 있으며, 특히 지정된 웹 사이트에 적합합니다. 이전에는 불가능했던 방식으로 IIS 핵심 파이프라인에 코드를 연결하고 IIS를 확장하는 것이 그 어느 때보다 쉬워졌습니다.

몇 가지 예를 제공하려면 개발자가 새 인증 및 권한 부여 체계를 제공하는 모듈 또는 처리기를 작성하고, 들어오는 요청에 대한 런타임 또는 보안 분석을 수행하고, 응답을 검사할 수 있는 몇 줄의 코드를 제공합니다. 그러나 실제 부가 가치를 제공하려면 프로그래밍 인터페이스, 명령줄 도구 및 사용자 인터페이스를 통해 이러한 모듈을 관리할 수 있어야 합니다.

이 백서는 사용자 지정 요청 처리기를 사용하여 IIS 웹 서버를 확장하는 방법에 대한 엔드 투 엔드 예제입니다. 이 처리기의 구성에 대한 API 및 명령줄 지원을 추가하는 방법과 IIS 관리 인터페이스에 사용자 인터페이스 모듈 플러그를 작성하는 방법을 보여 줍니다.

이 솔루션은 Windows Vista 및 Windows Server® 2008 베타 3에서 테스트되었습니다. Windows Server 2008의 최종 버전을 사용할 수 있게 되면 업데이트됩니다.

기능 집합

  • 관리되는 처리기가 이미지 파일에 저작권 메시지를 삽입합니다.
  • 저작권 메시지 기능은 구성 기반이며 새 IIS 구성 시스템을 사용합니다.
  • 구성을 스키마화하고 구성 API, WMI 스크립팅 및 IIS 명령줄 도구에 액세스할 수 있습니다.
  • 사용자 인터페이스 확장 모듈을 사용하면 IIS 사용자 인터페이스를 통해 저작권 메시지 기능을 구성할 수 있습니다.

사전 요구 사항

이 문서의 단계를 수행하려면 다음 소프트웨어를 설치해야 합니다.

ASP.NET

Windows Vista 제어판 통해 ASP.NET 설치합니다. "프로그램" - "Windows 기능 켜기 또는 끄기"를 선택합니다. 그런 다음 "인터넷 정보 서비스" - "World Wide Web Services" - 애플리케이션 개발 기능"을 열고 "ASP.NET"검사.

Windows Server 2008 빌드가 있는 경우 "서버 관리자" - "역할 관리"를 열고 "웹 서버(IIS)"를 선택합니다. "역할 서비스 추가"를 클릭합니다. "애플리케이션 개발" 검사 "ASP.NET".

또한 IIS의 WMI 확장성을 활용하려면 "IIS 관리 스크립트 및 도구"를 설치해야 합니다. 이렇게 하려면 "프로그램" - "Windows 기능 켜기 또는 끄기"를 선택합니다. 그런 다음 "인터넷 정보 서비스" - "웹 관리 도구"를 열고 "IIS 관리 스크립트 및 도구"를 검사.

Windows Server 2008 빌드가 있는 경우 "서버 관리자" - "역할"을 열고 "웹 서버(IIS)"를 선택합니다. "역할 서비스 추가"를 클릭합니다. "웹 관리 도구" 검사 " IIS 관리 스크립트 및 도구 ".

Visual C# Express Edition 또는 Visual Studio 2005

사용자 인터페이스 모듈의 경우 C# 개발 도구가 필요합니다. Visual Studio 2005 복사본이 없는 경우 Visual Studio 를 무료로 다운로드하세요.

사용자 계정 제어 문제 처리

Windows Vista 사용자 계정 보호는 액세스 토큰에서 관리자 권한을 제거합니다. 기본적으로 IIS 구성 및 콘텐츠 위치에 액세스할 수 없습니다. 이 문제를 해결하려면 관리자 권한 명령 프롬프트를 사용하여 이 문서를 진행하는 것이 좋습니다.

관리자 권한 명령 프롬프트를 시작하려면 "시작" 메뉴로 이동하여 "모든 프로그램" - "액세서리"를 클릭합니다. "명령 프롬프트"를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 클릭합니다. 권한 상승 프롬프트를 확인합니다.

시나리오

다음 예제에서는 그림 1과 같이 왼쪽 아래 모서리에 저작권 정보를 사용하여 웹 서버에서 제공하는 이미지를 동적으로 데코레이팅합니다.

흐린 하늘을 배경으로 눈 덮인 바위 산의 이미지를 표시하는 웹 페이지의 스크린샷.
그림 1: 이미지 저작권 모듈 작동 중

이미지를 데코레이트하는 처리기를 개발하기 위해 관리 코드를 사용합니다. 샘플의 일부로 이 처리기의 구성을 지정하고 IIS 구성 저장소에 저장합니다. 마지막으로 IIS Manager용 사용자 인터페이스 플러그 인을 개발합니다.

단순히 스키마 파일을 IIS 스키마 디렉터리에 복사하여 IIS 구성 저장소를 확장할 수 있습니다. 스키마는 새 구성 섹션의 이름과 해당 특성, 형식 및 기본값을 선언합니다. 이 예제에서는 imageCopyright라는 새 구성 섹션을 선언합니다. system.webServer 구성 그룹 내에 있습니다. 해당 속성은 다음과 같습니다.

  • imageCopyright 기능을 사용하거나 사용하지 않도록 설정하는 부울 플래그
  • 저작권 메시지를 포함하는 문자열 특성
  • 저작권 메시지의 색을 지정하는 색 특성

스키마 선언

다음 스키마 정의를 에 imagecopyright.xml 저장합니다.%windir%\system32\inetsrv\config\schema

<configSchema>
    <sectionSchema name="system.webServer/imageCopyright">
        <attribute name="enabled" type="bool" defaultValue="false" />
        <attribute name="message" type="string" defaultValue="Your Copyright Message" />
        <attribute name="color" type="string" defaultValue="Red"/> 
   </sectionSchema>
</configSchema>

"액세스 거부됨" 메시지가 표시되면 관리자 권한 명령 프롬프트에서 이 작업을 수행하지 않았습니다. 스키마 파일이 추가되면 스키마를 applicationhost.config 파일에 선언해야 합니다. 다음 XML을 에 추가합니다. %windir%\system32\inetsrv\config\applicationhost.config

<configSections>
...
<sectionGroup name="system.webServer">
<section name="imageCopyright"  overrideModeDefault="Allow"/>
...    
</sectionGroup>
</configSections>

구성

프로세스가 완료되었습니다. 명령줄을 통해 또는 applicationhost.config 또는 web.config 내에서 직접 새 구성 설정을 설정할 수 있습니다. 사용해 보세요. 명령 셸을 열고 다음을 입력합니다.

<system.webServer>
    <imageCopyright />
</system.webServer>

출력은 기본 구성으로 인식된 구성 섹션을 보여줍니다.

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

이제 appcmd.exe 통해 구성 설정을 추가합니다(예: ).

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

다음을 실행하여 구성이 저장되었는지 확인합니다.

%windir%\system32\inetsrv\appcmd list config -section:system.webServer/imageCopyright

저장된 구성을 참조하세요.

<system.webServer> 
    <imageCopyright enabled="true" message="Copyright (C) Contoso.COM" color="yellow" />
</system.webServer>

imageCopyright 구성 스크립트 가능으로 설정

참고

wMI 스크립팅에 imageCopyright 처리기 구성을 사용할 수 있도록 하는 것은 선택 사항입니다. 나머지 단계에 영향을 주지 않고 "2단계 – 핵심 확장성: 이미지 저작권 처리기"로 직접 갈 수 있습니다.

imageCopyright 처리기 구성을 WMI 스크립트에 사용할 수 있도록 하려면 다음 단계를 완료합니다.

  • IIS WMI 지원 설치
  • imageCopyright.mof 파일 만들기
  • webadministration.mof에 imageCopyright.mof 파일 포함 및 WMI 스키마 파일 컴파일
  • 스크립트 작성 및 실행

IIS WMI 지원 설치

IIS의 기본 설치에는 WMI 스크립팅 구성 요소가 포함되지 않습니다. 추가해야 합니다.

Vista 클라이언트 SKU에 WMI 지원 설치

Windows Vista 제어판 통해 "IIS 관리 스크립트 및 도구"를 설치합니다. "프로그램" - "Windows 기능 켜기 또는 끄기"를 선택합니다. 그런 다음 "인터넷 정보 서비스" - "웹 관리 도구"를 열고 "IIS 관리 스크립트 및 도구"를 검사.

Windows Server 2008 SKU에 WMI 지원 설치

Windows Server 2008 빌드가 있는 경우 "서버 관리자" - "역할"을 열고 "웹 서버(IIS)"를 선택합니다. "역할 서비스 추가"를 클릭합니다. "관리 도구" 검사 "IIS 관리 스크립트 및 도구".

imageCopyright.mof 파일 만들기

WMI 속성의 스키마 선언은 이전 단계에서 IIS 속성의 스키마 선언과 매우 유사합니다. WMI 스키마는 .mof 파일에서 선언되며 mofcomp라는 도구에 의해 컴파일됩니다. Mofcomp는 스키마 선언을 WMI 리포지토리에 추가합니다.

스키마 정보를 추가하는 작업

메모장 instance 열고 다음 줄을 복사합니다.

#pragma AUTORECOVER
#pragma namespace("\\\\.\\Root\\WebAdministration")
[            
    dynamic : ToInstance ToSubClass,
    provider("WebAdministrationProvider") : ToInstance ToSubClass,
    Description("imageCopyright Section") : ToSubClass,
    Locale(1033) : ToInstance ToSubClass,
    factory_clsid("{901a70b2-0f7a-44ea-b97b-1e9299dec8ca}"),
    section_path("system.webServer/imageCopyright"),
    SupportsUpdate
]
 
class imageCopyright : ConfigurationSection
{      
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("False"): ToSubClass ToInstance,
        Description("To be written"): ToSubClass ToInstance
    ]
    boolean Enabled;
  
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Your Copyright Message"): ToSubClass ToInstance,
        Description("Copyright Message"): ToSubClass ToInstance
    ]
    string Message;

    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Yellow"): ToSubClass ToInstance,
        Description("Color of Copyright Message"): ToSubClass ToInstance
    ]
    string Color;
};

스키마 선언에는 이전 단계의 imageCopyright.xml 것과 동일한 항목, 즉 구성 설정의 이름과 형식 및 기본값이 포함됩니다. 파일을 %windir%\system32\inetsrv\imageCopyright.mof로 저장합니다.

WMI 스키마 파일 컴파일

다음 명령을 실행하여 imageCopyright.mof 컴파일

mofcomp webadministration.mof

WMI 스크립트

Mofcomp는 imageCopyright 스키마를 WMI 리포지토리에 추가했습니다. IIS WMI 공급자를 스크립팅하여 IIS 구성 설정을 지정합니다. 예를 들면 다음과 같습니다.

작업

NOTEPAD instance 열고 다음 줄을 복사합니다. 파일을 SetCopyrightConfig.vbs 저장합니다.

Set oIIS = GetObject("winmgmts:root\WebAdministration")        
Set oSection = oIIS.Get("ImageCopyright.Path='MACHINE/WEBROOT/APPHOST/Default Web Site',Location=''")
oSection.Enabled = true
oSection.Message = "Copyright (C) IIS7 Team - Date: " & date
oSection.Color = "White"
oSection.Put_

IIS WMI 공급자에 연결하는 표준 WMI 스크립트입니다. 지정된 위치("기본 웹 사이트")에서 구성 섹션을 가져오고 해당 값을 변경합니다. Put_ 호출은 변경 내용을 디스크에 저장합니다.

스크립트를 실행하면 현재 날짜가 있는 저작권 메시지가 에 %systemdrive%\inetpub\wwwroot\web.config추가됩니다. 살펴보세요.

다음으로 이미지 저작권 처리기 자체를 추가합니다.

처리기는 요청이 특정 패턴(일반적으로 파일 확장명)과 일치할 때 실행되는 코드 조각입니다. 로 끝나는 요청입니다. 예를 들어 ASP는 ASP.DLL 매핑됩니다. IIS 6.0에서는 특정 파일 확장명의 요청을 처리하기 위해 ISAPI 확장자를 작성해야 했습니다. ASP.NET 파일 확장명 처리도 허용했지만 요청을 먼저 ASP.NET 매핑한 경우에만 가능합니다. IIS에서는 ASP.NET 포함하지 않고 임의의 파일 확장자를 처리할 수 있습니다. 이 예제에서는 확장 .JPG 사용하여 요청을 처리합니다. 이 작업을 수행하는 방법은 다음과 같습니다.

콘텐츠 디렉터리 만들기

콘텐츠 디렉터리(예 c:\inetpub\mypictures: )를 만들고 선택한 디지털 사진을 복사합니다. 이러한 파일이 확장명 .JPG 있는 이미지 파일인지 확인합니다.

참고

간단히 하기 위해 여기에 표시된 코드 예제에는 이미지 파일이 아닌 파일에 대한 오류 처리 코드가 포함되어 있지 않습니다.

새 디렉터리 아래에 App_Code 이라는 하위 디렉터리를 만듭니다(예 c:\inetpub\mypictures\App\_Code: ).

mypictures 애플리케이션 만들기

IIS 관리 콘솔을 통해 가리키는 c:\inetpub\mypictures 애플리케이션을 만들 수 있지만 더 흥미로운 방법이 있습니다. appcmd를 통해 새 애플리케이션을 만듭니다. 다음 명령은 실제 경로를 c:\inetpub\mypictures사용하여 "기본 웹 사이트"에 "mypictures"라는 앱을 만듭니다.

%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site"

-path:/mypictures -physicalPath:%systemdrive%\inetpub\mypictures

이 디렉터리에 복사된 JPG 파일을 확인하려면 디렉터리 검색을 사용하도록 설정합니다. IIS 관리 콘솔을 통해 이 작업을 수행하거나 더 흥미로운 방법을 사용하고 appcmd를 사용합니다. appcmd를 통해 디렉터리 검색을 true로 설정하는 방법은 다음과 같습니다.

%windir%\system32\inetsrv\appcmd set config "Default Web Site/mypictures"

 -section:directoryBrowse -enabled:true

를 요청 http://localhost/mypictures하면 그림이 포함된 디렉터리 목록이 표시됩니다.

코드를 작성하는 시간

이제 실제 이미지 처리 코드를 작성합니다. C# 코드 몇 줄을 작성하면 아래 코드를 참조로 사용하고 App_Code 디렉터리에 imagecopyrighthandler.cs로 저장합니다(예 c:\inetpub\mypictures\App\_Code\imagecopyrighthandler.cs: ).

#region Using directives
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.Web.Administration;
#endregion
  
namespace IIS7Demos
{
    public class imageCopyrightHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            ConfigurationSection imageCopyrightHandlerSection = 
                WebConfigurationManager.GetSection("system.webServer/imageCopyright");
  
            HandleImage(    context,
                            (bool)imageCopyrightHandlerSection.Attributes["enabled"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["message"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["color"].Value                            
                        );
        }
  
        void HandleImage(   HttpContext context,
                            bool enabled,
                            string copyrightText,
                            string color
                        )           
        {
            try
            {
                string strPath = context.Request.PhysicalPath;
                if (enabled)
                {
                    Bitmap bitmap = new Bitmap(strPath);
                    // add copyright message
                    Graphics g = Graphics.FromImage(bitmap);
                    Font f = new Font("Arial", 50, GraphicsUnit.Pixel);
                    SolidBrush sb = new SolidBrush(Color.FromName(color));
                    g.DrawString(   copyrightText,
                                    f,
                                    sb,
                                    5,
                                    bitmap.Height - f.Height - 5
                                );
                    f.Dispose();
                    g.Dispose();
                    // slow, but good looking resize for large images
                    context.Response.ContentType = "image/jpeg";
                    bitmap.Save(
                                        context.Response.OutputStream,
                                        System.Drawing.Imaging.ImageFormat.Jpeg
                                     );
                    bitmap.Dispose();
                }
                else
                {
                    context.Response.WriteFile(strPath);
                }
            }
            catch (Exception e)
            {
                context.Response.Write(e.Message);
            }
        }
  
        public bool IsReusable
        {
            get { return true; }
        }
    }
}

위의 코드는 다음을 수행합니다.

  • 구성을 읽습니다.
  • HandleImage 호출

HandleImage는 다음을 수행합니다.

  • 비트맵에서 Graphics 개체를 만듭니다.
  • 구성된 값을 사용하여 글꼴 개체를 만듭니다.
  • 메시지를 비트맵에 그립니다.

Microsoft.Web.Administration 클래스를 사용하려면 IIS 관리 API 어셈블리에 참조를 추가해야 합니다. 이렇게 하려면 다음 항목을 열고 %systemdrive%\inetpub\mypictures\web.config 추가합니다.

<system.web>
    <compilation>
      <assemblies>
        <add assembly="Microsoft.Web.Administration, Version=7.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
      </assemblies>
    </compilation>
</system.web>

처리기를 어셈블리로 컴파일하여 mypictures/bin에 넣을 수도 있습니다. 이렇게 하면 Microsoft.Web.Administration 어셈블리를 web.config 파일에 추가할 필요가 없습니다.

처리기 구성

.JPG 파일이 요청된 경우에만 IIS에 새 처리기를 호출하도록 지시하면 됩니다. IIS 관리 콘솔을 통해 수행하거나 appcmd를 사용합니다.

appcmd set config "Default Web Site/mypictures/" -section:handlers 

/+[name='JPG-imageCopyrightHandler',path='*.jpg',verb='GET',type='IIS7Demos.imageCopyrightHandler']

위의 appcmd 명령은 /mypictures 디렉터리에서만 새 처리기를 구성합니다. 처리기 항목은 컬렉션에 있으므로 +[] 구문을 사용해야 합니다. 이 구문은 컬렉션에 요소를 추가해야 하는 경우에 항상 사용됩니다. 처리기 구성의 요소는 다음과 같습니다.

name

고유한 이름일 수 있습니다. 이름은 처리기를 고유하게 식별하는 데만 사용됩니다.

path

이 처리기를 실행할 시기를 IIS에 알려줍니다. *.JPG .JPG 끝나는 모든 파일에 대해 이 처리기를 실행하도록 IIS에 지시합니다. foo*.JPG 경로로 사용하는 경우 foo로 시작하는 JPG 파일만 이 처리기에 의해 실행됩니다.

verb

이 처리기를 실행하기 위해 일치해야 하는 http 동사 목록을 쉼표로 구분합니다. 이 경우 GET 요청이 들어올 때만 요청을 실행하려고 합니다.

type

요청이 일치할 때 실행해야 하는 클래스의 관리되는 형식입니다. App_Code 디렉터리의 네임스페이스 및 IHttpHandler 파생 클래스로 구성됩니다.

마지막 메모 1개

저작권이 있는 이미지 테스트를 시작하기 전에 요청을 실행하는 IIS 작업자 프로세스가 수행한 스키마 변경 내용을 선택해야 합니다. 스키마 디렉터리에 imageCopyright.xml 파일을 추가했을 때 작업자 프로세스가 이미 실행 중일 수 있습니다. 이 경우 imagecopyrightconfig.cs에서 구성 예외가 발생합니다. 작성자가 이 문서를 작성할 때 이 문제가 발생하여 상당한 시간이 소요되었습니다.

애플리케이션 풀을 재활용하면 이 문제가 해결됩니다.

appcmd recycle AppPool DefaultAppPool

프로세스가 완료되었습니다. 이제 를 요청 http://localhost/mypictures/<imageOfYourChoice>.jpg)하면 저작권 메시지가 표시됩니다.

옵션:

  • appcmd를 통해 또는 web.config 파일을 직접 편집하여 저작권 메시지 옵션을 변경할 수 있습니다.
  • 다른 확장에 대해 동일한 처리기를 추가하여 imageCopyright 처리기를 다른 이미지 형식(예: BMP 또는 GIF)에 매핑할 수 있습니다. 예제:
appcmd set config "Default Web Site/mypictures/" -section:handlers /+[name='BMP-imageCopyrightHandler',path='*.bmp',verb='GET',type='IIS7Demos.imageCopyrightHandler']

마무리에 대한 시간입니다. 이미 몇 줄의 코드로 IIS 코어 서버를 확장했습니다. 코드 없이 IIS 구성 시스템을 확장했으며 무료로 명령줄 지원을 받았습니다. 이제 IIS 관리 콘솔을 통해 imageCopyright 처리기를 구성합니다.

다음 작업을 통해 이 작업을 수행합니다.

  • IIS 관리 콘솔 내에서 어셈블리를 사용할 수 있도록 Microsoft Visual Studio 또는 Microsoft Visual C# Express에서 프로젝트 만들기
  • 모듈 공급자 만들기
  • imageCopyright 속성을 읽고 설정하는 모듈을 만듭니다.

프로젝트 만들기

InetMgr에 대한 확장성 모듈을 만들려면 클래스 라이브러리 프로젝트라고도 하는 DLL 프로젝트를 만들어야 합니다. 이 DLL은 IIS 관리 콘솔에서 사용하는 모듈에 대한 요구 사항인 GAC(전역 어셈블리 캐시)에 등록할 수 있도록 강력한 이름을 지정해야 합니다.

단계

  1. 시작을 클릭하고 프로그램을 클릭하고 Microsoft Visual Studio 2005 또는 Microsoft Visual C# 2005 Express Edition을 실행합니다.

  2. 파일 메뉴에서 새 프로젝트 옵션을 선택합니다.

  3. 새 프로젝트 대화 상자에서 클래스 라이브러리를 프로젝트 유형으로 선택하고 imageCopyrightUI를 프로젝트 이름으로 입력하고 확인을 클릭합니다.

    클래스 라이브러리가 선택되고 프로젝트 이름으로 파일된 이름에 입력한 Copyright U 이미지가 있는 새 프로젝트 대화 상자의 스크린샷
    그림 2: 새 프로젝트 대화 상자

  4. 이 파일을 사용하지 않으므로 기본적으로 추가된 Class1.cs 파일을 제거합니다.

  5. 프로젝트 메뉴에서 새 참조 추가 옵션을 사용하여 \Windows\system32\inetsrv 디렉터리에 있는 Microsoft.Web.Management.dll 대한 참조를 추가합니다. IIS 관리 콘솔용 모듈을 만드는 데 필요한 모든 확장성 클래스를 포함하는 DLL입니다.

  6. 프로젝트 메뉴에서 새 참조 추가 옵션을 사용하여 \Windows\system32\inetsrv 디렉터리에 있는 Microsoft.Web.Administration.dll 대한 참조를 추가합니다. 이는 IIS 구성을 작성하는 구성을 읽는 데 필요한 모든 구성 클래스를 포함하는 DLL입니다.

  7. 코드를 사용하여 WinForms를 기반으로 UI를 만들 것이므로 System.Windows.Forms.dll 대한 참조도 추가하려고 합니다. 프로젝트 메뉴에서 새 참조 추가 옵션을 사용하여 다시 System.Windows.Forms.dll 선택하고 the.NET 어셈블리 목록에서 System.Web.dll.

  8. InetMgr 내에서 라이브러리를 사용해야 하는 요구 사항 중 하나는 GAC 내에 등록해야 한다는 것입니다. 이를 위해 DLL 이름이 강력한지 확인해야 합니다(서명됨이라고도 함). Visual Studio는 새 이름을 만들고 프로젝트에 사용할 이름을 선택하는 쉬운 방법을 제공하므로 이를 위해 프로젝트 메뉴를 사용하여 imageCopyrightUI 속성 옵션을 선택합니다.

  9. 서명 탭에서 어셈블리 서명 검사.

  10. 강력한 이름 키 만들기에서 imageCopyrightUI를 키 이름으로 입력하고 암호 검사 사용하여 내 키 파일 보호 상자의 선택을 취소합니다. 확인을 클릭합니다.

    키 파일 이름 및 암호로 입력한 Copyright U 이미지를 만들고 확인한 이미지를 표시하는 강력한 이름 키 만들기 대화 상자의 스크린샷
    그림 3: 강력한 이름 만들기 대화 상자

    서명 탭에 다음이 표시됩니다.

    강력한 이름 키 파일 선택 필드에서 저작권 I dots n k 이미지가 선택된 서명 탭의 스크린샷.
    그림 4: VS 프로젝트 서명 탭

  11. 어셈블리가 GAC에 있도록 하기 때문에 컴파일할 때마다 GAC에 자동으로 추가되도록 빌드 후 이벤트를 추가합니다. 이렇게 하면 새 기능을 추가할 때 디버그하고 변경할 수 있습니다. 이를 위해 빌드 이벤트 탭을 선택하고 다음 빌드 후 이벤트 명령줄을 추가합니다.

    call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
    
    gacutil.exe /if "$(TargetPath)"
    

    코드로 채워진 빌드 후 이벤트 명령줄의 스크린샷
    그림 5: VS 빌드 후 이벤트 탭

    (선택 사항) Microsoft Visual Studio 2005(Visual C# Express Edition에서는 작동하지 않음)를 사용하는 경우 F5 키를 사용하여 코드를 실행하도록 디버깅을 올바르게 설정합니다. 이렇게 하려면 프로젝트 속성으로 이동하고 디버그 탭을 선택한 다음, 외부 프로그램을 시작하도록 설정하여 \windows\system32\inetsrv\inetmgr.exe

    외부 프로그램 시작 작업으로 설정된 디버그 탭의 스크린샷
    그림 6: 디버깅 탭

  12. 마지막으로 프로젝트 속성을 닫고 파일 메뉴에서 모두 저장 옵션을 선택하고 확인을 클릭합니다.

    이제 빌드 메뉴에서 솔루션 빌드를 사용하여 프로젝트를 컴파일합니다. 그러면 DLL이 자동으로 빌드되고 GAC에 추가됩니다.

모듈 공급자 만들기

IIS 사용자 인터페이스는 IIS 핵심 서버 및 IIS 구성 시스템만큼 사용자 지정 가능하고 모듈식입니다. IIS 사용자 인터페이스는 제거하거나 바꿀 수 있는 기능 모듈 집합입니다. 각 UI 모듈의 진입점은 모듈 공급자입니다. 모든 모듈 공급자 목록은 섹션에서 찾을 %windir%\system32\inetsrv\Administration.config<modules> 수 있습니다.

첫 번째 단계로 imageCopyrightUI 모듈 공급자를 만듭니다.

단계

  1. 프로젝트 메뉴에서 새 항목 추가 옵션을 선택합니다. 새 항목 추가 대화 상자에서 클래스 템플릿을 선택하고 imageCopyrightUIModuleProvider.cs를 파일 이름으로 입력합니다.

    클래스 템플릿이 선택되고 이름 필드가 Copyright U I 모듈 공급자 dot c s 이미지로 채워진 새 항목 추가 대화 상자의 스크린샷
    그림 7: 새 항목 추가 대화 상자

  2. 다음과 같이 표시되도록 코드를 변경합니다.

    using System;
    using System.Security;
    using Microsoft.Web.Management.Server;
        
    namespace IIS7Demos           
    {
        class imageCopyrightUIProvider : ModuleProvider
        {
            public override Type ServiceType              
            {
                get { return null; }
            }
    
            public override ModuleDefinition GetModuleDefinition(IManagementContext context)
            {
                return new ModuleDefinition(Name, typeof(imageCopyrightUI).AssemblyQualifiedName);
            }
    
            public override bool SupportsScope(ManagementScope scope)
            {
                return true;
            }
        }            
    }
    

    이 코드는 모든 유형의 범위(서버, 사이트 및 애플리케이션)를 지원하는 ModuleProvider를 만들고 imageCopyrightUI라는 클라이언트 쪽 모듈을 등록합니다. 애플리케이션 수준에서만 모듈을 표시하기 위해 SupportsScope 함수는 다음과 같습니다.

    public override bool SupportsScope(ManagementScope scope)
    {
        return (scope == ManagementScope.Application) ;
    }
    

UI 모듈 만들기

모듈은 모든 확장성 개체에 대한 클라이언트의 기본 진입점입니다. Initialize라는 하나의 기본 메서드가 있습니다. 모든 작업이 수행되는 메서드입니다.

단계

  1. 프로젝트 메뉴에서 새 항목 추가 옵션을 선택합니다.

  2. 클래스 템플릿을 선택하고 imageCopyrightUI.cs를 파일 이름으로 입력합니다. 다음과 같이 표시되도록 코드를 변경합니다.

    using System;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    
    namespace IIS7Demos
    {
        internal class imageCopyrightUI : Module
        {
            protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
            {
                base.Initialize(serviceProvider, moduleInfo);
                IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel));
                ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(imageCopyrightUIPage), "Image Copyright", "Image Copyright");
                controlPanel.RegisterPage(modulePageInfo);
            }
        }              
    }
    

    위의 코드에서는 UI 모듈 목록에서 항목의 텍스트와 사용자가 이 텍스트를 클릭할 때 표시해야 하는 단일 페이지의 형식을 지정합니다.

남은 것은 페이지 자체를 작성하는 것입니다.

모듈 페이지 만들기

이 작업에서는 가장 기본적인 모듈 페이지를 만듭니다. ModulePage는 프레임워크에서 새 사용자 인터페이스를 만들기 위해 제공하는 기본 클래스입니다. 빌드하려는 시나리오에 따라 프레임워크에서 제공하는 네 가지 클래스가 있습니다.

  • ModulePage. 이 기본 클래스는 가장 기본적인 서비스만 제공하며 특별한 사용자 인터페이스를 전혀 제공하지 않습니다. InetMgr에 포함된 기능은 이 클래스에서 직접 파생되지 않습니다.
  • ModuleDialogPage. 이 기본 클래스는 작업 목록의 적용 및 취소 링크를 포함하여 대화 상자와 유사한 의미 체계를 제공하고 이 일반적인 작업을 처리하기 위해 재정의할 수 있는 특정 메서드를 제공합니다. 또한 새로 고침 및 기타 함수와 같은 항목도 자동으로 처리합니다. 이 페이지에서 파생되는 기능 샘플에는 컴퓨터 키, 관리 서비스 등이 있습니다.
  • ModulePropertiesPage. 이 기본 클래스는 모든 속성이 계층적 그리드와 유사한 컨트롤에 표시되는 Visual Studio Property Grid와 유사한 UI를 제공합니다. 이 샘플에는 CGI, ASP, .NET 컴파일 등이 포함됩니다.
  • ModuleListPage. 이 기본 클래스는 항목 목록을 표시해야 할 때마다 유용합니다. 여기에는 설정을 표시하는 데 사용할 수 있는 ListView 컨트롤이 포함되어 있으며 검색, 그룹화 및 보기를 자동으로 제공합니다. 샘플에는 애플리케이션 설정, 모듈, 작업자 프로세스 등이 포함됩니다.

단계

  1. 프로젝트 메뉴에서 새 항목 추가 옵션을 선택합니다.

  2. 새 항목 추가 대화 상자에서 클래스 템플릿을 선택하고 imageCopyrightUIPage.cs를 파일 이름으로 입력합니다. 다음과 같이 표시되도록 코드를 변경합니다.

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client.Win32;
    using Microsoft.Web.Administration;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    namespace IIS7Demos
    {
        public sealed class imageCopyrightUIPage : ModulePage
        {
            public string message;
            public bool featureenabled;
            public string color;
    
            ComboBox _colCombo = new ComboBox();
            TextBox _msgTB = new TextBox();
            CheckBox _enabledCB = new CheckBox();
            public imageCopyrightUIPage()
            {
                this.Initialize();
            }
            protected override void OnActivated(bool initialActivation)
            {
               base.OnActivated(initialActivation);
               if (initialActivation)
               {
                    ReadConfig();
                    UpdateUI();
                }
            }
    
            void UpdateUI()
            {
                _enabledCB.Checked = featureenabled;
                int n = _colCombo.FindString(color, 0);
                _colCombo.SelectedIndex = n;
                _msgTB.Text = message;
            }
    
            void Initialize()
            {
                Label crlabel = new Label();
                crlabel.Left = 50;
                crlabel.Top = 100;
                crlabel.AutoSize = true;
                crlabel.Text = "Enable Image Copyright:";
                _enabledCB.Text = "";
                _enabledCB.Left = 200;
                _enabledCB.Top = 100;
                _enabledCB.AutoSize = true;
    
                Label msglabel = new Label();
                msglabel.Left = 150;
                msglabel.Top = 130;
                msglabel.AutoSize = true;
                msglabel.Text = "Message:";
                _msgTB.Left = 200;
                _msgTB.Top = 130;
                _msgTB.Width = 200;
                _msgTB.Height = 50;
    
                Label collabel = new Label();
                collabel.Left = 160;
                collabel.Top = 160;
                collabel.AutoSize = true;
                collabel.Text = "Color:";
                _colCombo.Left = 200;
                _colCombo.Top = 160;
                _colCombo.Width = 50;
                _colCombo.Height = 90;
                _colCombo.Items.Add((object)"Yellow");
                _colCombo.Items.Add((object)"Blue");
                _colCombo.Items.Add((object)"Red");
                _colCombo.Items.Add((object)"White");
    
                Button apply = new Button();
                apply.Text = "Apply";
                apply.Click += new EventHandler(this.applyClick);
                apply.Left = 200;
                apply.AutoSize = true;
                apply.Top = 250;
    
                Controls.Add(crlabel);
                Controls.Add(_enabledCB);
                Controls.Add(collabel);
                Controls.Add(_colCombo);
                Controls.Add(msglabel);
                Controls.Add(_msgTB);
                Controls.Add(apply);
            }
    
            private void applyClick(Object sender, EventArgs e)
            {
                try
                {
                    UpdateVariables();
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration
                    (
                           Connection.ConfigurationPath.SiteName, 
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath
                    );
    
                section = config.GetSection("system.webServer/imageCopyright");
                section.GetAttribute("color").Value = (object)color;
                section.GetAttribute("message").Value = (object)message;
                section.GetAttribute("enabled").Value = (object)featureenabled;
    
                mgr.CommitChanges();
    
                }
    
                catch
                {}
    
            }
    
            public void UpdateVariables()
            {
                featureenabled = _enabledCB.Checked;
                color = _colCombo.Text;
                message = _msgTB.Text;
            }
    
            public void ReadConfig()
            {
                try
                {
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration(
                           Connection.ConfigurationPath.SiteName,
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath);
    
                    section = config.GetSection("system.webServer/imageCopyright");
                    color = (string)section.GetAttribute("color").Value;
                    message = (string)section.GetAttribute("message").Value;
                    featureenabled = (bool)section.GetAttribute("enabled").Value;
    
                }
    
                catch
                {}
    
            }
        }
    }
    

    많은 작업이 있지만 이 코드는 ModulePage에 몇 가지 컨트롤을 배치하고 IIS 구성 저장소에 읽고 쓰는 것 이상의 작업을 수행합니다.

읽기 구성

ReadConfig 함수는 동일한 Microsoft.Web.Administration 인터페이스를 사용하여 IIS 구성 저장소를 엽니다. UI 자체는 구성 설정이 적용되는 scope 제공합니다.

예제:

Connection.ConfigurationPath.SiteName,

Connection.ConfigurationPath.ApplicationPath+

Connection.ConfigurationPath.FolderPath

구성 저장

적용 단추를 클릭하면 구성이 저장됩니다(applyClick 함수). UI에서 변경한 내용이 섹션 특성으로 전송되고 섹션이 디스크에 저장됩니다.

section.GetAttribute("enabled").Value = (object)featureenabled;

mgr.CommitChanges();

이 시점에서 빌드 메뉴에서 "빌드 솔루션"을 사용하여 모든 항목을 다시 컴파일할 준비가 된 것입니다. 그러면 어셈블리 이미지CopyrightUI가 빌드되고 전역 어셈블리 캐시에 배치됩니다.

모듈 등록

UI 모듈이 빌드되었지만 여전히 IIS 관리 콘솔에 로드하도록 지시해야 합니다. 다음을 수행합니다.

  • 전역 어셈블리 캐시에서 UI 모듈의 강력한 이름 가져오기
  • IIS 관리 콘솔의 구성 파일에 강력한 이름 및 형식을 추가합니다. 이렇게 하면 IIS 관리 콘솔이 시작 시 형식을 로드합니다.
  • UI 모듈 목록에서 모듈 사용

단계

  1. 기존 관리자 권한 명령 셸을 열거나 사용하고 다음 명령을 실행하여 Visual Studio 8.0 환경 변수를 등록합니다.

    "%vs80comntools%\vsvars32.bat
    
  2. GacUtil 실행

    GACUTIL /l imageCopyrightUI
    
  3. %windir%\system32\inetsrv\config\administration.config 를 열고 항목 바로 다음에 다음을 추가합니다<moduleProviders>.

    <add name="imageCopyrightUI" type="IIS7Demos.imageCopyrightUIProvider, IIS7Demos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3fd9bd5e992ee757"/>
    

결과

작업이 완료되었습니다. 결과를 살펴봅니다.

IIS 관리 콘솔을 열고 /mypictures 애플리케이션으로 이동합니다.

"이미지 저작권" 항목을 두 번 클릭합니다.

내 사진 애플리케이션이 선택되고 이미지 저작권 메시지가 표시된 I S 관리 콘솔의 스크린샷
그림 8: 이미지 저작권 사용자 인터페이스

저작권 메시지를 변경하고 적용을 클릭하고 브라우저를 새로 고칩니다. 저작권 메시지가 변경되었습니다. 디렉터리의 web.config 파일을 %systemdrive%\inetpub\mypictures 조사하여 변경된 구성을 확인합니다.

요약

IIS는 이전에는 불가능했던 방식으로 확장할 수 있습니다. 고유한 구성 요소를 사용하여 IIS 핵심 처리 파이프라인을 확장하고, 이 구성 요소에 대한 구성을 IIS 구성과 함께 저장하고, 표준 IIS 설정과 나란히 있는 사용자 인터페이스 플러그 인을 작성할 수도 있습니다. 이전 예제에서 수행된 작업을 검토하려면 다음을 수행합니다.

IIS Core 확장성

제공되는 각 .JPG 파일에 저작권 메시지를 삽입하는 이미지 처리기를 IIS 코어에 추가했습니다. 이 작업은 몇 줄의 C# 코드로만 수행되었습니다. 처리기의 기능은 구성 기반이었습니다. 구성을 일반 IIS 구성 파일 applicationhost.config 저장하고 web.config. 이미지에 대한 캐싱 지원도 추가되었습니다.

IIS 구성 시스템 확장성

이미지 저작권 처리기 구성을 IIS 구성 시스템에 추가했습니다. 읽기 쉬운 xml 저장소, 인스턴트 API 및 명령줄 지원, 위임 및 분산 배포와 같은 이점은 무료로 제공되었습니다. 한 줄의 코드를 작성할 필요가 없었습니다.

IIS 사용자 인터페이스 확장성

기능의 가시성을 제공하기 위해 IIS 사용자 인터페이스 모듈을 추가했습니다. 표시되지는 않지만 IIS 사용자 인터페이스는 HTTPS를 통해 완전히 원격으로 사용할 수 있습니다.