내보내기(0) 인쇄
모두 확장

Windows Azure에서 VM 역할의 어댑터 개발

업데이트 날짜: 2011년 3월

[Windows Azure의 VM 역할 기능은 2013년 5월 15일에 만료됩니다. 만료 날짜 이후에 VM 역할 배포는 삭제됩니다. 기존 응용 프로그램을 계속 사용하려는 경우 Windows Azure 가상 컴퓨터를 사용할 수 있습니다. 사용 중인 응용 프로그램을 위해 가상 컴퓨터를 사용하는 방법에 대해서는 Moving from VM Role to Windows Azure Virtual Machines(VM 역할에서 Windows Azure 가상 컴퓨터로 이동)를 참조하십시오.

운영 체제를 시작할 때 자동으로 시작되고 Microsoft.WindowsAzure.ServiceRuntime API를 사용하여 Windows Azure의 런타임 정보를 사용하는 Windows 서비스로 어댑터를 작성할 수 있습니다. 현재 VM 역할 인스턴스 또는 서비스에서 실행되는 다른 역할 인스턴스에 대한 네트워크 주소 정보가 필요한 경우, 로컬 저장소 리소스에 기록해야 하는 경우 또는 런타임에 서비스 구성 설정을 읽어야 하거나 해당 설정이 변경될 때 응답해야 하는 경우 Windows 서비스를 작성해야 할 수 있습니다.

이 섹션에서는 VM 역할을 지원하는 서비스를 보여 주는 어댑터를 작성하는 방법을 보여 줍니다. 이 섹션에 사용되는 예에서는 운영 체제가 시작될 때 Windows Azure 드라이브를 탑재한 다음 HTTP 로그 파일을 드라이브에 기록하도록 인터넷 정보 서비스(IIS)를 구성합니다.

어댑터를 만들려면 다음 태스크를 완료해야 합니다.

  1. 저장소 컨테이너 만들기

  2. 어댑터 프로젝트 만들기

  3. 역할 인스턴스 구성 변경 내용을 추적하는 기능 추가

  4. 어댑터가 시작될 때 발생하는 작업 정의

  5. 어댑터가 중지될 때 발생하는 작업 정의

  6. 어댑터용 설치 관리자 만들기

  7. 어댑터용 설치 프로젝트 만들기

  8. 어셈블리 불일치를 수정하기 위해 빌드 후 이벤트 추가

  9. 클라우드 서비스 모델에 구성 설정 추가

  10. 어댑터 설치

어댑터는 Blob 저장소를 사용하여 Windows Azure 드라이브에 로그 데이터를 쉽게 저장할 수 있도록 합니다. Windows Azure의 저장소 계정에 액세스할 수 있어야 하고 어댑터에 사용되는 컨테이너를 만들어야 합니다. 선호하는 도구를 사용하여 Windows Azure 저장소에 선택한 이름을 가진 컨테이너를 만들 수 있습니다. 클라우드 서비스 모델을 구성할 때 컨테이너 이름을 사용합니다.

Visual Studio 2010에서는 Windows 서비스를 만들기 위한 템플릿을 제공합니다. 이 템플릿을 사용하여 VM 역할 인스턴스에 대한 어댑터를 만들 수 있습니다.

  1. Visual Studio 2010을 열고 파일, 새로 만들기, 프로젝트를 차례로 클릭합니다.

  2. Visual C#설치된 템플릿 창에서 Windows를 클릭한 다음 가운데 창에서 Windows 서비스를 클릭합니다.

  3. 솔루션 및 어댑터 프로젝트의 이름을 입력한 다음 확인을 클릭합니다.

  4. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 구성 관리자를 클릭한 다음 프로젝트에 대해 모든 CPU가 선택되어 있는지 확인하고 닫기를 클릭합니다.

  5. 솔루션 탐색기에서 Service1.cs 파일의 이름을 어댑터에 사용 중인 이름으로 바꿉니다. 이 섹션의 예에서는 선택한 이름을 나타내는 AdapterName 자리 표시자를 사용합니다.

  6. 프로젝트를 마우스 오른쪽 단추로 클릭하고 응용 프로그램 페이지에서 속성을 클릭한 다음 대상 프레임워크.NET Framework 3.5가 선택되어 있는지 확인합니다.

  7. 프로젝트 속성의 게시 페이지에서 필수 구성 요소를 클릭한 다음 .NET Framework 4(클라이언트 프로필)이 선택되어 있지 않은지 확인합니다.

  8. 솔루션 탐색기에서 다음 어셈블리에 대한 참조를 추가합니다.

    • Microsoft.WindowsAzure.ServiceRuntime.dll

      note참고
      이 어셈블리에 대한 로컬 복사 속성이 False로 설정되어 있는지 확인해야 합니다.

    • Microsoft.WindowsAzure.CloudDrive.dll

    • Microsoft.WindowsAzure.StorageClient.dll

    • Microsoft.Web.Administration.dll

  9. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  10. 다음 using 문을 추가합니다.

    
    using Microsoft.WindowsAzure.ServiceRuntime;
    using Microsoft.WindowsAzure.StorageClient;
    using Microsoft.WindowsAzure;
    using Microsoft.Web.Administration;
    using System.IO;
    using System.Threading;
    
  11. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 뷰 디자이너를 클릭합니다.

  12. 속성 창에서 다음 속성을 설정합니다.

    • ServiceName - 어댑터가 시스템에 식별되는 이름을 지정할 수 있습니다.

    • (이름) - 코드에서 어댑터 개체를 나타내는 데 사용되는 이름을 지정할 수 있습니다.

    • CanShutdown – 시스템이 종료될 때 알림을 받을 어댑터에 대해서는 이 속성 값을 True로 지정해야 합니다.

Program.cs 파일에는 다음 코드가 포함되어 있습니다.


static void Main()
{
   ServiceBase[] ServicesToRun;
   ServicesToRun = new ServiceBase[] 
   { 
      new ServiceName() 
   };  
   ServiceBase.Run(ServicesToRun);
}

역할 인스턴스 구성이 변경될 때 수행되는 작업을 정의할 수 있습니다. 예를 들어 역할 인스턴스 구성을 변경하여 로깅 데이터가 저장될 드라이브의 위치를 변경할 수 있습니다. 이렇게 하려면 RoleEnvironment 이벤트를 사용합니다.

  1. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  2. 생성자를 편집하여 구성 변경 이벤트를 정의합니다. 다음 코드 예제에서는 생성자에 추가된 이벤트 정의를 보여 줍니다.

    
    public AdapterName()
    {
       InitializeComponent();
       RoleEnvironment.Changed += RoleEnvironmentChanged;
       RoleEnvironment.StatusCheck += RoleEnvironmentStatusCheck;
    }
    
  3. Changed 이벤트가 발생할 때 호출되는 RoleEnvironmentChanged 메서드를 추가합니다. 다음 코드 예제에서는 새 Windows Azure 드라이브를 탑재하고 로그 파일을 새 드라이브에 기록하도록 IIS를 구성하는 RoleEnvironmentChanged 메서드를 보여 줍니다.

    
    private CloudDrive currentDrive;
     
    private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
    {
       if(!e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>().Any(
          c => c.ConfigurationSettingName == "AdapterName.BlobPath"))
          return;
    
       try
       {
          // perform a rolling drive change
          var oldDrive = this.currentDrive;
          var newDrive = MountDrive();
          try
          {
             ConfigureWebServer(newDrive.LocalPath);
          }
          catch (Exception)
          {
             UnmountDrive(newDrive);
             throw;
          }
          this.currentDrive = newDrive;
          UnmountDrive(oldDrive);
       }
       catch (Exception ex)
       {
          this.EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
          throw;
       }
    }
    

    여기서 AdapterName은 어댑터 프로젝트에 지정한 이름입니다.

  4. Windows Azure 드라이브를 탑재하고 탑재 해제하는 메서드를 추가하고 IIS에 대한 로그 파일 위치를 구성하는 메서드를 추가합니다. 다음 코드 예제에서는 MountDrive 메서드를 보여 줍니다.

    
    private CloudDrive MountDrive()
    {
       // create or mount an instance-specific drive
       var credentials = GetStorageCredentials();
       var driveUri = GetDriveUri();
       var drive = new CloudDrive(driveUri, credentials);
    
       try
       {
          drive.Create(1024);
       }
       catch (Exception ex)
       {
          if (ex.Message != "ERROR_BLOB_ALREADY_EXISTS") throw;
       }
    
       // mount the drive
       string mountPoint = drive.Mount(1024, 
          DriveMountOptions.FixFileSystemErrors | DriveMountOptions.Force);
       this.EventLog.WriteEntry(string.Format("{0} mounted at {1}", drive.Uri, mountPoint));
       return drive;
    }
    
    private Uri GetDriveUri()
    {
       return new Uri(string.Format(
       RoleEnvironment.GetConfigurationSettingValue("AdapterName.BlobPath"),
          RoleEnvironment.CurrentRoleInstance.Id));
    }
    
    private StorageCredentials GetStorageCredentials()
    {
       return new StorageCredentialsAccountAndKey(
       RoleEnvironment.GetConfigurationSettingValue("AdapterName.AccountName"),
       RoleEnvironment.GetConfigurationSettingValue("AdapterName.AccountKey"));
    }
    

    CloudDrive API를 사용하는 방법에 대한 자세한 내용은 CloudDrive를 참조하십시오. AdapterName.BlobPath, AdapterName.AccountName 및 AdapterName.AccountKey 설정은 클라우드 서비스 정의 파일에 정의되어 있고 서비스 구성 파일에 구성되어 있습니다. 이러한 설정을 정의하는 방법에 대한 자세한 내용은 클라우드 서비스 모델에 구성 설정 추가를 참조하십시오.

    다음 코드 예제에서는 UnmountDrive 메서드를 보여 줍니다.

    
    private void UnmountDrive(CloudDrive drive)
    {
       drive.Unmount();
       this.EventLog.WriteEntry(string.Format("{0} unmounted", drive.Uri));
    }
    
    

    다음 코드 예제에서는 ConfigureWebServer 메서드를 보여 줍니다.

    
    private void ConfigureWebServer(string drivePath)
    {
       using (var config = new ServerManager())
       {
          var logdir = Path.Combine(drivePath, @"inetpub\logs\LogFiles");
          config.SiteDefaults.LogFile.Directory = logdir;
    
          config.CommitChanges();
    
          this.EventLog.WriteEntry(string.Format("IIS log location set to '{0}'", logdir));
       }
    }
    
    
  5. 역할 인스턴스의 상태를 확인 하는 데 사용되는 RoleEnvironmentStatusCheck 메서드를 추가합니다. statusCheckWaitHandle 개체는 역할 인스턴스가 사용 중인지 준비 상태인지 부하 분산 장치에 알려 주는 신호로 사용됩니다. 개체의 Set 메서드에 대한 호출은 구성 변경이 완료되었다는 신호입니다. 다음 코드 예제에서는 RoleEnvironmentStatusCheck 메서드를 보여 줍니다.

    
    private readonly EventWaitHandle statusCheckWaitHandle = new ManualResetEvent(false);
    private volatile bool busy = true;
    
    private void RoleEnvironmentStatusCheck(object sender, RoleInstanceStatusCheckEventArgs e)
    {
       if (this.busy)
       {
          e.SetBusy();
       }
       statusCheckWaitHandle.Set();
    }
    
    

이 예에서는 어댑터가 시작될 때 다음 작업을 수행합니다.

  • 드라이브 캐시 초기화

  • 드라이브 탑재

  • 탑재된 드라이브를 사용하도록 IIS 구성

  1. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다. 프로젝트를 만들 때 자동으로 재정의된 OnStart 메서드를 찾고 역할 인스턴스가 실행 중인지 확인하는 코드를 추가하고 별도의 스레드에서 어댑터 작업을 수행한 다음 statusCheckWaitHandle 개체를 사용하여 작업이 완료되었음을 알립니다.

    
    protected override void OnStart(string[] args)
    {
       /// Windows Azure waits for auto-start services to be fully started 
       /// before sending any traffic.  Service Control Manager (SCM) does
       /// not impose a time limit on startup; the service need only 
       /// request additional time.
    
       if (!RoleEnvironment.IsAvailable) return;
          
       var startThread = new Thread(OnStartInternal);
       startThread.Start();
    
       // wait until a status check has occurred, so that Windows Azure 
       // knows we are working on something.
       WaitForHandle(statusCheckWaitHandle);
    }
    

    다음 코드 예제에서는 Windows Azure 드라이브를 탑재하고 로그 데이터를 쓰기 위한 새 드라이브를 사용하도록 IIS 구성을 변경하는 OnStartInternal 메서드를 보여 줍니다.

    
    private void OnStartInternal()
    {
       try
       {
          // initialize the drive cache
          string cachePath = RoleEnvironment.GetLocalResource("Data").RootPath;
          CloudDrive.InitializeCache(cachePath, 4096);
          this.EventLog.WriteEntry("initialization succeeded");
    
          // mount the current drive
          this.currentDrive = MountDrive();
    
          // configure IIS
          ConfigureWebServer(this.currentDrive.LocalPath);
    
          this.busy = false;
       }
       catch (Exception ex)
       {
          this.EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
          throw;
       }
    }
    

    다음 코드 예제에서는 상태 검사가 수행될 때까지 대기하는 WaitForHandle 메서드를 보여 줍니다.

    
    private const int ThreadPollTimeInMilliseconds = 1000;
    
    private void WaitForHandle(WaitHandle handle)
    {
       while (!handle.WaitOne(ThreadPollTimeInMilliseconds))
       {
          this.RequestAdditionalTime(ThreadPollTimeInMilliseconds * 2);
       }
    }
    

이 예에서는 어댑터가 중지될 때 로그 파일 위치를 다시 구성하고 드라이브를 탑재 해제합니다.

  1. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다. 프로젝트를 만들 때 자동으로 재정의된 OnStop 메서드를 찾은 다음, 로그 파일 위치를 다시 구성하고 드라이브를 탑재 해제하는 코드를 추가합니다.

    
    protected override void OnStop()
    {
       OnStopInternal();
    }
    
  2. 다음 코드 예제에서는 OnShutdown 메서드를 보여 줍니다.

    
    protected override void OnShutdown()
    {
       /// Windows Azure stops sending traffic before shutting down.
       /// Note that some requests may still be executing.
       OnStopInternal();
    }
    
  3. 작업이 수행되는 OnStopInternal 메서드를 추가합니다.

    
    private void OnStopInternal()
    {
       try
       {
          ConfigureWebServer(@"%SystemDrive%");
    
          if (this.currentDrive != null)
          {
             UnmountDrive(this.currentDrive);
             this.currentDrive = null;
          }
       }
       catch (Exception ex)
       {
          this.EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
          throw;
       }
    }
    
    

Windows 서비스를 설치할 때 설치 관리자 클래스가 수행할 수 있는 일부 사용자 지정 작업이 수행되어야 합니다. Visual Studio는 Windows 이러한 서비스 전용 설치 관리자를 만들어 프로젝트에 추가할 수 있습니다.

  1. 솔루션 탐색기에서 AdapterName.cs를 마우스 오른쪽 단추로 클릭한 다음 뷰 디자이너를 선택합니다.

  2. 디자이너의 배경을 클릭하여 내용이 아닌 어댑터 자체를 선택합니다.

  3. 디자이너에 포커스가 있는 상태에서 마우스 오른쪽 단추를 클릭한 다음 설치 관리자 추가를 클릭합니다.

    기본적으로 두 개의 설치 관리자를 포함하는 구성 요소 클래스가 프로젝트에 추가됩니다. 구성 요소 이름은 ProjectInstaller이며, 이 구성 요소를 포함하는 설치 관리자는 어댑터용 설치 관리자와 어댑터의 연결된 프로세스용 설치 관리자입니다.

  4. ProjectInstaller의 디자인 뷰에서 serviceInstaller1을 클릭합니다.

  5. 속성 창에서 ServiceName 속성을 어댑터 이름으로 설정합니다.

  6. StartType 속성을 자동으로 설정합니다.

  7. 디자이너에서 serviceProcessInstaller1을 클릭합니다. 계정 속성을 LocalService로 설정합니다. 그러면 어댑터가 로컬 서비스 계정에서 설치되고 실행됩니다.

  8. 프로젝트를 빌드합니다.

설치 프로젝트는 컴파일된 프로젝트 파일을 설치하고 어댑터를 실행하는 데 필요한 설치 관리자를 실행합니다. 전체 설치 프로젝트를 만들려면 설치 프로젝트에 프로젝트 출력을 추가한 다음 프로그램을 설치하는 사용자 지정 작업을 추가해야 합니다.

  1. 솔루션 탐색기에서 마우스 오른쪽 단추를 클릭하여 솔루션을 선택하고 추가를 가리킨 다음 새 프로젝트를 클릭합니다.

  2. 설치된 템플릿 창에서 기타 프로젝트 형식을 확장하고 설치 및 배포 프로젝트를 확장한 다음 Visual Studio 설치 관리자를 클릭합니다.

  3. 가운데 창에서 설치 프로젝트를 클릭합니다.

  4. 설치 프로젝트 이름을 입력한 다음 확인을 클릭합니다.

  5. 발견된 종속성을 확장하고 Microsoft .NET Framework를 두 번 클릭한 다음 속성 창에서 버전 값이 .NET Framework 3.5인지 확인합니다.

  6. 발견된 종속성 아래의 다음과 같은 어셈블리 각각에 대해 어셈블리를 마우스 오른쪽 단추로 클릭한 다음 제외를 클릭합니다.

    • Microsoft.Web.Administration.dll

    • Microsoft.WindowsAzure.ServiceRuntime.dll

    • msshrtmi.dll

    • mswacdmi.dll

이제 어댑터용 프로그램 파일을 설치하는 사용자 지정 작업을 추가합니다.

  1. 솔루션 탐색기에서 설치 프로젝트를 마우스 오른쪽 단추로 클릭하고 보기를 가리킨 다음 사용자 지정 작업을 클릭합니다.

  2. 사용자 지정 작업 편집기에서 사용자 지정 작업 노드를 마우스 오른쪽 단추로 클릭한 다음 사용자 지정 작업 추가를 선택합니다.

  3. 목록 상자에서 응용 프로그램 폴더를 두 번 클릭하여 열고 출력 추가를 선택합니다.

  4. 프로젝트 출력 그룹 추가 창에서 기본 출력을 선택하고 구성에 대해 (활성)을 선택한 다음 확인을 클릭합니다.

Visual Studio는 .msi 파일에 32비트 어셈블리를 삽입하지만 Windows Azure에는 64비트 어셈블리가 필요하기 때문에 스크립트를 실행하여 불일치 어셈블리를 수정해야 합니다. JavaScript 파일을 빌드 후 이벤트로 사용하여 어셈블리를 수정할 수 있습니다.

  1. 설치 프로젝트의 루트 폴더에 있는 FixMSI.js 파일에 다음 코드를 저장합니다.

    
    // workaround for "BadImageFormatException" issue - see http://msdn.microsoft.com/ko-kr/library/kz0ke5xt.aspx
    
    var msiOpenDatabaseModeTransact = 1;
    var msiViewModifyInsert = 1
    var msiViewModifyUpdate = 2
    var msiViewModifyAssign = 3
    var msiViewModifyReplace = 4
    var msiViewModifyDelete = 6
    
    var filespec = WScript.Arguments(0);
    var frameworkpath = WScript.Arguments(1);
    var installer = WScript.CreateObject("WindowsInstaller.Installer");
    var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);
    
    WScript.Echo("Updating file '" + filespec + "' to use a 64-bit custom action...");
    
    Update64Bit();
    
    database.Commit();
    database = null;
    installer = null;
    
    function Update64Bit() {
        var sql;
        var view;
        var record;
        sql = "SELECT * FROM Binary WHERE `Name`='InstallUtil'";
        view = database.OpenView(sql);
        view.Execute();
        record = view.Fetch();
        if (record != null) {
            var dataCol = 2;
            record.SetStream(dataCol, frameworkpath + "\\InstallUtilLib.dll");
            view.Modify(msiViewModifyUpdate, record);
        }
        record = null;
        view.close();
        view = null;
    }
    
  2. 솔루션 탐색기에서 이전에 만든 설치 프로젝트를 클릭한 다음 속성 창에서 PostBuildEvent 속성에 다음 명령을 추가합니다.

    
    cd $(ProjectDir) 
    CScript //NoLogo FixMSI.js "$(BuiltOutputPath)" "%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727"
    
  3. 솔루션 탐색기에서 설치 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 빌드를 클릭합니다.

어댑터가 Windows Azure와 통신할 수 있게 하려면 클라우드 서비스 모델에 설정을 정의해야 합니다.

  1. VM 역할에 대한 ServiceDefinition.csdef 파일을 엽니다.

  2. ConfigurationSettings 요소에 다음 설정을 추가합니다.

    
    <Setting name="AdapterName.BlobPath" />
    <Setting name="AdapterName.AccountName" />
    <Setting name="AdapterName.AccountKey" />
    

    여기서 AdapterName은 어댑터 프로젝트의 이름입니다.

  3. LocalResources 요소에 다음 설정을 추가합니다.

    
    <LocalStorage name="Data" />
    

    서비스 모델에 사용할 수 있는 요소에 대한 자세한 내용은 VirtualMachineRole Schema를 참조하십시오.

  4. 파일을 저장합니다.

  1. VM 역할에 대한 ServiceConfiguration.cscfg 파일을 엽니다.

  2. 파일에 다음 구성 설정을 추가합니다.

    
    <Setting name="AdapterName.BlobPath" value="http://StorageAccountName.blob.core.windows.net/ContainerName/{0}.vhd" />
    <Setting name="AdapterName.AccountName" value="StorageAccountName" />
    <Setting name="AdapterName.AccountKey" value="StorageAccountKey" />
    

    여기서 AdapterName은 만든 어댑터 프로젝트의 이름입니다. StorageAccountName은 저장소 계정의 이름이고, StorageAccountKey는 저장소 계정의 기본 키이고, ContainerName은 이전에 만든 저장소 컨테이너입니다. 서비스 모델의 구성에 대한 자세한 내용은 Windows Azure Service Configuration Schema를 참조하십시오. 설정을 정의하고 구성하는 방법에 대한 자세한 내용은 VM 역할 서비스 모델 만들기 및 배포를 참조하십시오.

  3. 파일을 저장합니다.

이제 Windows Azure에 업로드할 VHD에 어댑터를 설치할 준비가 되었습니다.

코드를 만들고 서비스 모델에 설정을 정의하고 구성한 후에는 어댑터를 설치하고 서비스 모델 패키지를 배포할 수 있습니다. VM 역할의 경우 Windows Azure 통합 구성 요소를 설치하면 가상 컴퓨터에 어댑터가 설치됩니다.

어댑터를 제대로 작동하려면 몇 가지 운영 체제 기능을 활성화해야 합니다. Windows Azure에 업로드할 이미지에서 다음 명령을 실행합니다.

DISM /Online /Enable-Feature /FeatureName:NetFx3 /FeatureName:IIS-WebServerRole /FeatureName:IIS-WebServer /FeatureName:IIS-CommonHttpFeatures /FeatureName:IIS-HttpErrors /FeatureName:IIS-ApplicationDevelopment /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-HttpLogging /FeatureName:IIS-RequestMonitor /FeatureName:IIS-Security /FeatureName:IIS-RequestFiltering /FeatureName:IIS-Performance /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-ManagementConsole

어댑터를 설치하려면 .msi 파일이 포함된 폴더를 찾은 다음 해당 파일을 두 번 클릭합니다. 이 파일은 이전에 만든 설치 프로젝트의 Debug 폴더에 있습니다.

참고 항목

커뮤니티 추가 항목

표시:
© 2014 Microsoft