최근 Windows Azure 위에서 사용하기 위하여 WCF 서비스를 테스트하던 중, 이전에 Windows Azure SDK에서 소개했던 문제점을 발견하게되었습니다. IIS에 의하여 호스팅되는 WCF 서비스를 클라우드 밖의 환경에서 참조하기 위하여 프록시 클래스를 생성할 때, Windows Azure의 외부 호스트 주소가 아닌 VM의 로컬 주소를 기준으로 프록시 클래스가 생성되는 현상으로, On-Premise 환경과 달리 Windows Azure Platform의 네트워크 인프라가 로드밸런서에 의하여 동적으로 관리된다는 데에 문제의 핵심이 있습니다.

 

이미 지난 2월에 Windows Azure SDK를 발표하면서 이에 관한 패치 (KB971842 / KB977420)가 같이 소개되었습니다만 이를 실제로 Windows Azure Application에 적용하는 방법에 대한 문서를 써볼 필요가 있어서 늦게나마 이를 올려봅니다. 이 패치는 개발자 컴퓨터에 직접 설치하는 패치로, 이 패치를 통하여 변경되는 사항은 Windows Azure VM 내에도 적용되어있는 상태입니다.

 

1. 패치 설치하기

 

Windows Vista 및 Windows Server 2008에서 Windows Azure SDK를 이용하여 개발하실 경우, http://code.msdn.microsoft.com/KB971842 에서 패치를 다운로드하여 설치하여 주시고, Windows 7 및 Windows Server 2008 R2에서 Windows Azure SDK를 이용하여 개발하실 경우 http://code.msdn.microsoft.com/KB977420 에서 패치를 다운로드하여 설치하여 주시기 바랍니다. (기술 지원 문서는 각각 http://support.microsoft.com/kb/971842 와 http://support.microsoft.com/kb/977420 의 내용을 참조하여 주십시오.)

 

2. Windows Azure Web Role / Worker Role에 Custom Behavior 추가하기

 

기존의 Windows Azure Web Role이나 Worker Role의 WCF 설정 섹션 (system.serviceModel 요소) 아래에 다음과 같은 설정을 추가합니다.

 

    <behaviors>
      <serviceBehaviors>
        <behavior name="LoadBalancedBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <useRequestHeadersForMetadataAddress>
            <defaultPorts>
              <add scheme="http" port="81" />
              <add scheme="https" port="444" />
            </defaultPorts>
          </useRequestHeadersForMetadataAddress>

        </behavior>
      </serviceBehaviors>
    </behaviors>

 

위에서 강조 표시한 부분이 KB971842와 KB977420을 통하여 제공되는 업데이트를 활성화하는데에 필요한 요소입니다. useRequestHeadersForMetadataAddress 요소는 Behavior 이름이 LoadBalancedBehavior라는 설정에 한정되어 유효한 태그이며, 그 이외의 경우는 잘못된 Child 요소로 분류되어 프로그램 수준에서 오류가 발생합니다. 그리고 위의 설정은 Windows Azure Simulator나 Windows Azure Host Process에서만 제대로 동작하며 직접 IIS로 호스팅하는 경우에는 설정이 반영되지 않습니다.

 

만약 기존에 사용하는 별도의 Behavior 설정이 있었다면 기존 Behavior 설정은 유지하시고, LoadBalancedBehavior 설정에 추가하기를 원하는 부분만 복사하여 그대로 붙여넣으면 온전하게 반영됩니다.

 

3. WCF 서비스에 Behavior 연결하기

 

    <services>
      <service behaviorConfiguration="LoadBalancedBehavior" name="PhoneNUse.WebRole.PhoneNUse">
        <endpoint address="" binding="basicHttpBinding" contract="PhoneNUse.WebRole.IPhoneNUse" bindingConfiguration="PhoneNUse.WebRole.IPhoneNUse">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

 

위에서 굵은 표시로 강조한 부분의 속성 값, 즉 behaviorConfiguration 부분만 위에서 지정한 Custom Behavior의 이름인 LoadBalancedBehavior로 변경해주면 서비스에서의 설정은 끝이 납니다.

 

4. 실버라이트를 고려하는 경우

 

실버라이트 컨텐츠를 클라이언트로 사용하는 경우, Windows Azure가 아닌 경우에도 해당이 되지만, Windows Azure에서 WCF를 호스팅할 때에도 동일하게 적용되는 부분이 있습니다. 바로 WCF 서비스의 바인딩 형태에 관한 것과 Cross Domain에 관한 부분입니다.

 

    <services>
      <service behaviorConfiguration="LoadBalancedBehavior" name="PhoneNUse.WebRole.PhoneNUse">
        <endpoint address="" binding="basicHttpBinding" contract="PhoneNUse.WebRole.IPhoneNUse" bindingConfiguration="PhoneNUse.WebRole.IPhoneNUse">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <basicHttpBinding>
        <binding name="PhoneNUse.WebRole.IPhoneNUse">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>

 

위에서 강조 표시한 부분이 실버라이트와의 통신을 고려한 BasicHttpBinding에 대한 설정이 되겠습니다. 그리고 아래의 XML 파일이 clientaccesspolicy.xml 파일이며 보통 Windows Azure Web Role Root에 배치됩니다.

 

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

 

5. 주소 필터 불일치로 인한 문제 해결하기

 

Windows Azure에서 실행되는 WCF 서비스의 경우, 주소 필터 불일치로 인한 문제 때문에 역시 프록시 클래스를 이용한 통신에서 실패할 수 있는데, 이를 방지하기 위한 목적으로 주소 필터의 설정을 완화하는 Attribute를 선언적으로 클래스 앞에 붙일 수 있습니다. 다음의 코드가 그 예시입니다.

 

    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
    public class PhoneNUse : IPhoneNUse
    {
        ....

    }

 

그 외에 좀 더 자세한 내용, 상세한 설정 방법 등은 http://code.msdn.microsoft.com/wcfazure/Wiki/View.aspx?title=KnownIssues 에 게시되어있는 글을 참조하시면 많은 도움이 될 것입니다.

 

감사합니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Windows Azure 개발 환경 및 기능 살펴보기에 대한 세미나를 준비하는 도중에 테스트를 위하여 설치와 테스트를 병행하던 도중, 문제에 빠질 수 있는 부분들이 몇 가지 있을 것으로 예상되어 개발 환경을 구축하는 방법에 대한 글을 정리하여 올려봅니다.

 

1. 시스템의 최소 요구 사항을 확인합니다.

 

Windows Azure 개발 환경을 구축하기 위해서는 시스템이 Windows Vista Service Pack 1 이상 - 또는 - Windows Server 2008을 실행 중이어야 합니다. Windows XP와 Windows Server 2003에서는 Windows Azure 개발 환경을 구축할 수 없음을 유의합니다. Windows Vista RTM 버전을 사용 중인 경우, 반드시 Service Pack 1을 설치하여야 합니다.

 

2. 인터넷 정보 서비스 (IIS) 및 WCF HTTP 활성화 옵션이 설정되어있는지 확인합니다.

 

Windows Azure 개발 환경을 구축하기 위해서는 시스템에 Internet Information Services (인터넷 정보 서비스)와 함께, WCF HTTP 기반 활성화 옵션이 설정되어있어야 합니다. 이를 확인하시려면 각 운영 체제 별로 다음과 같이 실행합니다.

 

Windows Vista 및 Windows 7의 경우

  • 시작 메뉴 -> 설정 -> 제어판 -> 프로그램 -> 프로그램 및 기능 순으로 선택합니다.
  • Windows 기능 켜고 끄기를 선택합니다.
  • Microsoft .NET Framework 3.0 (Windows 7의 경우 Microsoft .NET Framework 3.5.1)아래의 Windows Communication Foundation HTTP 활성화에 체크합니다.
  • Internet Information Services (또는 인터넷 정보 서비스) 아래의 World Wide Web 서비스 아래의 응용프로그램 개발 기능 아래에서 ASP.NET과 CGI에 체크합니다.
  • 선택한 항목들을 설치합니다.

Windows Server 2008 및 Windows Server 2008 SP1의 경우 (Core 버전은 해당되지 않습니다)

  • 시작 메뉴 -> 프로그램 -> 관리 도구 -> 서버 관리자 순으로 선택합니다.
  • 서버 관리자 화면에서, "기능 요약"의 "추가"를 선택합니다.
  • "추가" 대화 상자에서, Microsoft .NET Framework 3.0 (Windows Server 2008 SP1의 경우 Microsoft .NET Framework 3.5.1) 아래의 WCF 활성화 아래의 HTTP 활성화를 선택한 후, "다음" 버튼을 클릭합니다.
  • "역할 요약" 단계에서, 웹 서버 (IIS) 항목이 목록 중에 포함되어있는지 확인합니다. 만약 없을 경우, "역할 추가" 버튼을 클릭합니다.
  • "역할 추가" 대화 상자에서, "역할 요약" 아래의 "웹 서버 (IIS)"를 선택합니다.
  • 웹 서버 관리 대화 상자에서 "서비스 역할 추가"를 클릭합니다.
  • 나타나는 대화 상자에서 "웹 서버" 아래의 "응용프로그램 개발" 아래의 "ASP.NET"과 "CGI"를 선택하고, 다음 버튼을 클릭하여 선택한 항목들을 설치합니다.

3. Visual Studio를 설치합니다.

 

Visual Studio 2008 Professional 이상의 버전이 필요하며, Visual Studio 2008 Professional을 가지고 있지 않은 경우, http://www.microsoft.com/express/ 에서 Visual Web Developer 2008 SP1을 다운로드하여 설치할 수 있습니다.

 

Visual Studio 2008 Professional이 설치되어있으나 서비스팩을 설치하지 않은 경우, http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx 에서 다운로드하여 설치할 수 있습니다.

 

Visual Studio 2010에서 테스트해보기를 원하는 경우, Visual Studio 2010 Beta 2 - 또는 - http://www.microsoft.com/express/ 에서 Visual Web Developer 2010 Beta 2를 무료로 다운로드하여 설치할 수 있습니다.

 

4단계의 내용과 관련하여, 설치 시 자동으로 선택되는 SQL Server 2005 - 또는 SQL Server 2008 Express Edition은 같이 설치해주실 것을 권장합니다.

 

4. Microsoft SQL Server 2005 - 또는 - Microsoft SQL Server 2008 인스턴스를 확인합니다.

 

Windows Azure의 Storage 기능을 로컬 컴퓨터에서 테스트해보기 위하여, Microsoft SQL Server 2005 버전 이상의 데이터베이스 인스턴스가 필요합니다. 개발 목적으로 사용하기 위하여, 무료로 Express Edition을 다운로드받을 수 있으며, Visual Studio 2008 설치 시 기본 옵션으로 설치하였을 경우 이미 시스템에 하나 이상의 SQL Server Express Edition이 설치되어있을 것입니다.

 

5. Windows Azure SDK 2009년 11월 버전을 설치합니다.

 

로컬 컴퓨터에서 Windows Azure 플랫폼의 환경을 재현하는 도구, Windows Azure 플랫폼에서 사용하는 닷넷 어셈블리의 개발 버전 및 필수 도움말, 기본 문서 자료, 배포용 패키징 도구 일체를 포함하는 Windows Azure SDK를 다운로드하여 설치해야 합니다. http://www.microsoft.com/downloads/info.aspx?na=47&p=2&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=6967ff37-813e-47c7-b987-889124b43abd&u=details.aspx%3ffamilyid%3d772990DA-8926-4DB0-958F-95C1DA572C84%26displaylang%3den 에서 다운로드 가능합니다.

 

NOTE) 이 글을 작성하는 현 시점에서 가장 최신 버전은 2009년 11월 버전이며 새 버전이 출시될 수 있으므로 Windows Azure 홈페이지를 참고하여 주시기 바랍니다.

 

6. Windows Azure Tools 2009년 11월 버전을 설치합니다.

 

Windows Azure SDK와 연계하여, Visual Studio 2008 및 Visual Studio 2010을 위한 개발 도구, 프로젝트 템플릿, 필수 도움말 및 기본 문서 자료 일체를 포함하는 Windows Azure Tools를 다운로드하여 설치해야합니다. http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&displaylang=en 에서 다운로드 가능합니다.

 

7. KB967631 핫픽스 설치 (운영 체제 무관, Visual Studio 2008 SP1 및 Visual Web Developer 2008 SP1 사용 시 설치 필요)

 

운영 체제에 관계없이, Visual Studio 2008 SP1 및 Visual Web Developer 2008 SP1을 사용하여 Windows Azure SDK 및 Windows Azure Tools 2009년 11월 버전을 활용하는 경우, http://go.microsoft.com/fwlink/?LinkId=145526 에서 KB967631 핫 픽스를 설치하여 디버깅에 관련된 문제점을 수정할 수 있습니다.

 

8. KB967131 핫픽스 설치 (개발 도구 무관, Windows 7, Windows Server 2008 SP2 미만인 경우 설치 필요)

 

개발 도구 버전에 관계 없이, Windows Vista 모든 버전, Windows Server 2008 SP1의 경우 http://support.microsoft.com/kb/967131 에서 FastCGI 기반의 개발을 정상적으로 테스트해볼 수 있도록 시스템을 수정할 수 있습니다.

 

9. KB963676 핫픽스 설치 (개발 도구 무관, Windows 7 이외의 모든 운영 체제에서 설치 필요)

 

개발 도구 버전에 관계 없이, Windows 7 이외의 모든 운영 체제에서 https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=16827&wa=wsignin1.0 의 핫픽스를 설치하여 Visual Studio의 안정성 문제를 해결할 수 있습니다.

 

10. KB971842 / KB977420 핫픽스 설치 (개발 도구 무관)

 

개발 도구 버전에 관계없이, Windows Vista 및 Windows Server 2008은 KB971842 핫 픽스를, Windows 7 및 Windows Server 2008 R2는 KB977420 핫 픽스를 설치하여, Windows Azure Web Role 위에서 실행되는 WCF 서비스에 대한 참조를 클라이언트에서 정확하게 받아들일 수 있도록 할 수 있습니다.

 

KB971842 (Windows Vista, Windows Server 2008) 설치: http://code.msdn.microsoft.com/KB971842

KB977420 (Windows 7, Windows Server 2008 R2) 설치: http://code.msdn.microsoft.com/KB977420

 

이 핫 픽스를 설치하고, 설정 파일 (.config)에 useRequestHeaderForMetadataAddress 요소를 추가하여 HTTP 요청 헤더를 기준으로 WCF 참조를 맺고 통신할 수 있도록 설정합니다.

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)