이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
Azure에서 역할 인스턴스에 대한 통신 사용

Azure에서 역할 인스턴스에 대한 통신 사용

업데이트 날짜: 2014년 8월

Azure의 클라우드 서비스에서 실행되는 역할 인스턴스는 필요한 통신 유형에 따라 다양한 내부 및 외부 연결을 통해 통신합니다. 외부 클라이언트와 통신하는 데 사용되는 외부 연결을 입력 끝점이라고 하며, 클라우드 서비스의 다른 역할 인스턴스와 통신하는 데 사용되는 내부 연결을 내부 끝점이라고 합니다. 입력 끝점은 HTTP, HTTPS 또는 TCP 프로토콜을 사용하여 연결될 수 있고, 내부 끝점은 HTTP 또는 TCP 프로토콜을 사용하여 연결될 수 있습니다. 끝점은 IP 주소 및 포트와 연결되며 여기서 입력 끝점은 정의한 포트에 연결되고 내부 끝점은 Azure에서 동적으로 할당된 포트입니다. 서비스 정의에서 끝점을 정의할 때 localPort 특성을 지정하여 사용되는 동일한 외부 포트에 내부 포트를 정적으로 할당할 수 있습니다.

Azure에서 만든 클라우드 서비스는 프로덕션 환경과 스테이징 환경 중 하나에 배포될 수 있습니다. 이러한 환경 중 하나에서 배포된 서비스에는 DNS 이름과 IP 주소가 할당됩니다. 프로덕션 환경과 연결된 DNS 이름은 런타임에 할당되고 서비스의 수명 동안 고정됩니다. 스테이징 환경의 DNS 이름은 서비스를 배포할 때마다 동적으로 생성됩니다. 서비스가 이러한 환경 중 하나에 배포될 때마다 환경과 연결된 DNS 이름에는 사용 가능한 주소 풀의 IP 주소가 할당됩니다. IP 주소는 서비스 배포가 삭제될 때까지 유지됩니다. 응용 프로그램 업그레이드, 구성 변경 또는 프로덕션 환경과 스테이징 환경 교체로 인해 IP 주소가 변경되지는 않습니다.

note참고
Azure에서 사용하는 IP 주소의 범위는 변경될 수 있습니다. 방화벽 정책이나 다른 IP 기반 보안을 설정하는 경우 IP 기반 필터링을 사용하면 안 됩니다. IP 주소 범위에 의존하지 않는 다른 보안 메커니즘을 사용해야 합니다.

입력 끝점은 Azure 외부에서 역할 인스턴스와 통신하는 데 사용됩니다. 내부 끝점은 내부 역할 통신(예: 역할 대 역할 통신)에 사용됩니다. 역할에 대해 정의된 각 입력 끝점은 고유한 포트에서 수신해야 합니다. 입력 끝점에 대해 정의된 포트는 인터넷에서 클라우드 서비스를 사용할 수 있도록 하기 위해 Azure의 부하 분산 장치에서 사용됩니다. 서비스 정의에서 localPort 특성을 사용하지 않는 한 Azure Fabric Controller는 내부 포트를 할당합니다. Azure Fabric Controller가 내부 포트 번호를 선택하는 경우 다음 코드 예제를 사용하여 해당 포트 번호를 검색할 수 있습니다.

int port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["EndPointName"].IPEndpoint.Port;

최대 25개의 웹 역할 또는 작업자 역할 인스턴스를 클라우드 서비스에 배포할 수 있고 최대 25개의 입력 끝점을 이러한 인스턴스에 분산할 수 있습니다. 예를 들어 클라우드 서비스가 실행 중인 하나의 웹 역할 또는 작업자 역할 인스턴스를 포함하고 해당 역할 인스턴스마다 정의된 25개의 끝점 모두를 포함하거나, 클라우드 서비스가 각각 하나의 끝점을 사용하는 실행 중인 25개의 웹 역할 또는 작업자 역할 인스턴스를 포함할 수 있습니다. 클라우드 서비스는 최대 150개의 끝점이 있는 최대 50개의 가상 컴퓨터를 배포할 수 있습니다.

서비스 정의 파일에서 WebRole 및 WorkerRole 요소에 InputEndpoint 요소를 포함하는 Endpoints 요소를 추가하여 역할에 대한 입력 끝점을 정의할 수 있습니다. InputEndpoint 요소는 끝점의 이름, 프로토콜 및 포트를 정의합니다. 이러한 요소에 대한 자세한 내용은 Azure 서비스 정의 스키마(.csdef 파일)를 참조하십시오. 가상 컴퓨터의 배포에 통신을 설정하려면 가상 컴퓨터에 대한 끝점을 설정하는 방법을 참조하십시오.

  1. 텍스트 편집기에서 서비스의 ServiceDefinition.csdef 파일을 엽니다.

  2. 역할 요소에 InputEndpoint 요소를 포함하는 Endpoints 요소를 추가합니다. 다음 예에서는 포트 80에서 수신하는 웹 역할에 대해 HTTP 입력 끝점을 추가하고 내부 포트 80을 정의하는 방법을 보여 줍니다.

    
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WebRole name="WebRole1">
        <Endpoints>
          <InputEndpoint name="HttpIn" protocol="http" port="80" localPort="80" />
        </Endpoints>
      </WebRole>
    </ServiceDefinition>
    
    
    note참고
    localPort 특성은 선택 사항입니다. 이 특성이 정의되지 않은 경우 패브릭은 런타임에 내부 포트 번호를 할당합니다.

    다음 예는 포트 10000에서 수신하는 작업자 역할에 대해 TCP 입력 끝점을 추가하는 방법을 보여 줍니다.

     
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WorkerRole name="WorkerRole1">    
        <Endpoints>
          <InputEndpoint name="Endpoint1" protocol="tcp" port="10000" />
        </Endpoints>
      </WorkerRole>
    </ServiceDefinition>
    
  3. 사용하려는 끝점의 이름을 설정합니다.

  4. 사용할 유형의 통신 프로토콜을 설정합니다. HTTP, HTTPS 또는 TCP 중 하나를 선택할 수 있습니다.

  5. 역할 통신에 사용할 포트 번호를 지정합니다.

  6. 파일을 저장합니다.

서비스 정의 파일에서 WebRole 및 WorkerRole 요소에 InternalEndpoints 요소를 포함하는 Endpoints 요소를 추가하여 역할에 대한 내부 끝점을 최대 25개까지 정의할 수 있습니다. 역할 인스턴스당 최대 5개의 내부 끝점을 정의할 수 있습니다. 이러한 요소에 대한 자세한 내용은 Azure 서비스 정의 스키마(.csdef 파일)를 참조하십시오.

  1. 텍스트 편집기에서 서비스의 ServiceDefinition.csdef 파일을 엽니다.

  2. 웹 역할 또는 작업자 역할의 경우 WebRole 요소나 WorkerRole 요소에 InternalEndpoint 요소를 포함하는 Endpoints 요소를 추가합니다. 다음 예는 지정된 포트 번호의 웹 역할에 HTTP 내부 끝점을 추가하는 방법을 보여 줍니다.

    
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WebRole name="WebRole1">
        <Endpoints>
          <InternalEndpoint name="InternalHttpIn" protocol="http" port="1000"/>
        </Endpoints>
      </WebRole>
    </ServiceDefinition>
    
    note참고
    포트는 선택 사항으로, Azure에서 자동으로 포트 번호를 할당하게 할 수 있습니다.

    다음 예는 작업자 역할에 TCP 내부 끝점을 추가하는 방법을 보여 줍니다.

    
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WorkerRole name="WorkerRole1">
        <Endpoints>
          <InternalEndpoint name="Endpoint1" protocol="tcp" />
        </Endpoints>
      </WorkerRole>
    </ServiceDefinition>
    

    또한 필요할 경우 포트 번호의 범위를 정의할 수 있습니다.

    
    <InternalEndpoint name="InternalPoint1" protocol="tcp">
      <FixedPortRange min="1000" max="2000" />
    </InternalEndpoint>
    
  3. 사용하려는 끝점의 이름을 설정합니다.

  4. 사용할 유형의 통신 프로토콜을 설정합니다.

  5. 파일을 저장합니다.

서비스 정의 파일에서 WebRole 또는 WorkerRole 요소에 InstanceInputEndpoints 요소를 포함하는 Endpoints 요소를 추가하여 역할에 대한 직접 포트(인스턴스 입력 끝점)를 정의할 수 있습니다. 이러한 요소에 대한 자세한 내용은 Azure 서비스 정의 스키마(.csdef 파일)를 참조하십시오. 직접 포트 끝점은 부하가 분산된 역할 인스턴스와 통신하는 데 사용됩니다.

  1. 텍스트 편집기에서 서비스의 ServiceDefinition.csdef 파일을 엽니다.

  2. 웹 역할 또는 작업자 역할에 대해 역할 요소에 InstanceInputEndpoint 요소를 포함하는 Endpoints 요소를 추가합니다. 다음 예에서는 로컬 포트 번호와 공용 직접 포트 범위가 지정된 웹 역할에 대해 TCP 직접 포트 끝점을 추가하는 방법을 보여 줍니다.

    
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WebRole name="WebRole1">
        <Endpoints>
          <InputEndpoint name=”Endpoint1” protocol=”http” port=”10101” localPort=”80” />
          <InstanceInputEndpoint name="Endpoint2" localPort="1000" protocol="tcp">
            <AllocatePublicPortFrom>
              <FixedPortRange min="10016" max="10020"/>
            </AllocatePublicPortFrom>
          </InstanceInputEndpoint>
        </Endpoints>
      </WebRole>
    </ServiceDefinition>
    
    Important중요
    위의 예에 표시된 XML에는 InstanceInputEndpoint(직접 포트) 요소보다 먼저 InputEndpoint 요소가 정의되어 있습니다. InputEndpoint 요소가 없을 경우 스키마 구성 오류가 발생하여 응용 프로그램을 배포할 수 없습니다. 모든 웹 역할 서비스는 첫 번째 끝점으로 HTTP/HTTPS 끝점이 정의되어 있어야 하며 없을 경우 Azure Fabric이 자동으로 하나 만듭니다. 그런데 서비스 정의에서 첫 번째 끝점이 InstanceInputEndpoint일 경우 이 자동 생성 과정에서 오류가 발생합니다. 서비스 정의 XML 파일(.csdef)을 수정하지 않고 끝점을 추가할 수 있는 Visual Studio 사용자 인터페이스 요소는 이 요구 사항을 강제 적용하지 않습니다.

    다음 예는 직접 포트 공용 액세스가 설정된 작업자 역할에 대해 TCP 내부 끝점을 추가하는 방법을 보여 줍니다.

    
    <ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
      <WorkerRole name="WorkerRole1">
        <Endpoints>
          <InstanceInputEndpoint name="InstanceInputEndpoint1" localPort="1000" protocol="tcp">
            <AllocatePublicPortFrom>
              <FixedPortRange min="10016" max="10020"/>
            </AllocatePublicPortFrom>
          </InstanceInputEndpoint>
        </Endpoints>
      </WorkerRole>
    </ServiceDefinition>
    
  3. 사용하려는 끝점의 이름을 설정합니다.

  4. 사용할 유형의 통신 프로토콜을 설정합니다.

  5. 파일을 저장합니다.

아래 예제 코드에서는 작업자 역할 내에서 소켓을 만들고 직접 포트 끝점에서 요청을 수신하는 방법을 보여 줍니다.

Warning경고
이 코드는 배포된 서비스에서만 작동합니다. Azure 계산 에뮬레이터에서 실행할 때 직접 포트 끝점(InstanceInputEndpoint 요소)을 만드는 서비스 구성 요소는 무시됩니다.


using System;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
 
namespace WorkerRole1
{
  public class WorkerRole : RoleEntryPoint
  {
    public override void Run()
    {
      try
      {
        // Initialize method-wide variables
        var epName = "Endpoint1";
        var roleInstance = RoleEnvironment.CurrentRoleInstance;
        
        // Identify direct communication port
        var myPublicEp = roleInstance.InstanceEndpoints[epName].PublicIPEndpoint;
        Trace.TraceInformation("IP:{0}, Port:{1}", myPublicEp.Address, myPublicEp.Port);
 
        // Identify public endpoint
        var myInternalEp = roleInstance.InstanceEndpoints[epName].IPEndpoint;
                
        // Create socket listener
        var listener = new Socket(
          myInternalEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                
        // Bind socket listener to internal endpoint and listen
        listener.Bind(myInternalEp);
        listener.Listen(10);
        Trace.TraceInformation("Listening on IP:{0},Port: {1}",
          myInternalEp.Address, myInternalEp.Port);
 
        while (true)
        {
          // Block the thread and wait for a client request
          Socket handler = listener.Accept();
          Trace.TraceInformation("Client request received.");
 
          // Define body of socket handler
          var handlerThread = new Thread(
            new ParameterizedThreadStart(h =>
            {
              var socket = h as Socket;
              Trace.TraceInformation("Local:{0} Remote{1}",
                socket.LocalEndPoint, socket.RemoteEndPoint);
 
              // Shut down and close socket
              socket.Shutdown(SocketShutdown.Both);
              socket.Close();
            }
          ));
 
          // Start socket handler on new thread
          handlerThread.Start(handler);
        }
      }
      catch (Exception e)
      {
        Trace.TraceError("Caught exception in run. Details: {0}", e);
      }
    }
 
    public override bool OnStart()
    {
      // Set the maximum number of concurrent connections 
      ServicePointManager.DefaultConnectionLimit = 12;
 
      // For information on handling configuration changes
      // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
      return base.OnStart();
    }
  }
}

내부 끝점을 정의한 후 역할 인스턴스가 서로 통신하는 방법을 제어하기 위해 만든 끝점을 기반으로 네트워크 트래픽 규칙을 추가할 수 있습니다. 다음 다이어그램에서는 역할 통신을 제어하기 위한 몇 가지 일반적인 시나리오를 보여 줍니다.

네트워크 트래픽 규칙 시나리오
  • 시나리오 1WebRole1에서 WorkerRole1로의 네트워크 트래픽만 허용합니다.

  • 시나리오 2WebRole1에서 WorkerRole1WorkerRole2로의 네트워크 트래픽만 허용합니다.

  • 시나리오 3WebRole1에서 WorkerRole1로, WorkerRole1에서 WorkerRole2로의 네트워크 트래픽만 허용합니다.

  • 시나리오 4WebRole1에서 WorkerRole1로, WebRole1에서 WorkerRole2로, WorkerRole1에서 WorkerRole2로의 네트워크 트래픽만 허용합니다.

다음 코드 예제에서는 이전 다이어그램에 표시된 역할에 대한 역할 정의를 보여 줍니다. 각 역할 정의에는 정의된 내부 끝점이 하나 이상 포함되어 있습니다.


<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebRole1" vmsize="Medium"> 
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
      <InternalEndpoint name="InternalTCP1" protocol="tcp" />
    </Endpoints>
  </WebRole>
  <WorkerRole name="WorkerRole1">
    <Endpoints>
      <InternalEndpoint name="InternalTCP2" protocol="tcp" />
    </Endpoints>
  </WorkerRole> 
  <WorkerRole name="WorkerRole2">
    <Endpoints>
      <InternalEndpoint name="InternalTCP3" protocol="tcp" />
      <InternalEndpoint name="InternalTCP4" protocol="tcp" />
    </Endpoints>
  </WorkerRole>
</ServiceDefinition>
note참고
둘 다 고정되고 자동으로 할당된 포트의 내부 끝점을 사용하는 경우 역할 간의 통신 제한이 발생할 수 있습니다.

기본적으로 내부 끝점이 정의된 후에는 통신이 제한 없이 특정 역할에서 다른 역할의 내부 끝점으로 이동할 수 있습니다. 통신을 제한하려면 서비스 정의 파일의 ServiceDefinition 요소에 NetworkTrafficRules 요소를 추가해야 합니다.

  1. 텍스트 편집기에서 서비스의 ServiceDefinition.csdef 파일을 엽니다.

  2. 네트워크 트래픽 규칙을 정의하는 XML 코드를 추가합니다.

    • 시나리오 1의 경우 ServiceDefinition 요소 내에 다음 코드를 추가합니다.

      
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo>
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
          </Destinations>
          <AllowAllTraffic/>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WebRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      
    • 시나리오 2의 경우 ServiceDefinition 요소 내에 다음 코드를 추가합니다.

      
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo>
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
            <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
          </Destinations>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WebRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      
      
    • 시나리오 3의 경우 ServiceDefinition 요소 내에 다음 코드를 추가합니다.

      
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo>
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
          </Destinations>
          <AllowAllTraffic/>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WebRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo>
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
          </Destinations>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WorkerRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      
      
    • 시나리오 4의 경우 ServiceDefinition 요소 내에 다음 코드를 추가합니다.

      
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo>
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP2" roleName="WorkerRole1"/>
          </Destinations>
          <AllowAllTraffic/>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WebRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo >
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP3" roleName="WorkerRole2"/>
          </Destinations>
          <AllowAllTraffic/>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WorkerRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules> 
      <NetworkTrafficRules>
        <OnlyAllowTrafficTo >
          <Destinations>
            <RoleEndpoint endpointName="InternalTCP4" roleName="WorkerRole2"/>
          </Destinations>
          <AllowAllTraffic/>
          <WhenSource matches="AnyRule">
            <FromRole roleName="WebRole1"/>
          </WhenSource>
        </OnlyAllowTrafficTo>
      </NetworkTrafficRules>
      
      
  3. 파일을 저장합니다.

예제에서 사용되는 요소에 대한 자세한 내용은 NetworkTrafficRules 스키마를 참조하십시오.

Azure Managed Library는 런타임에 통신하기 위해 역할 인스턴스에 대한 메서드를 제공합니다. 역할 인스턴스 내에서 실행되는 코드에서 현재 역할 인스턴스에 대한 정보뿐만 아니라 다른 역할 인스턴스 및 해당 끝점의 존재에 대한 정보를 검색할 수 있습니다.

note참고
클라우드 서비스에서 실행되고 하나 이상의 내부 끝점을 정의하는 역할 인스턴스에 대한 정보만 검색할 수 있습니다. 다른 서비스에서 실행되는 역할 인스턴스에 대한 데이터는 얻을 수 없습니다.

Instances 속성을 사용하여 역할의 인스턴스를 검색할 수 있습니다. 먼저 CurrentRoleInstance를 사용하여 현재 역할 인스턴스에 대한 참조를 반환한 다음 Role 속성을 사용하여 역할 자체에 대한 참조를 반환합니다.

Instances 속성은 RoleInstance 개체의 컬렉션을 반환합니다. 이 컬렉션에는 항상 현재 인스턴스가 포함됩니다. 역할이 내부 끝점을 정의하지 않는 경우 컬렉션에는 현재 인스턴스가 포함되지만 다른 인스턴스는 포함되지 않습니다. 역할에 대해 정의된 내부 끝점이 없는 경우 컬렉션의 역할 인스턴스 수는 항상 1입니다. 역할이 내부 끝점을 정의하는 경우 역할의 인스턴스는 런타임에 검색 가능하며 컬렉션의 인스턴스 수는 서비스 구성 파일에서 역할에 대해 지정된 인스턴스 수에 해당합니다.

note참고
Azure Managed Library는 다른 역할 인스턴스의 상태를 확인하는 수단을 제공하지 않지만 서비스에 이러한 기능이 필요한 경우 이러한 상태 평가 기능을 직접 구현할 수 있습니다. Azure 진단을 사용하여 역할 인스턴스 실행에 대한 정보를 얻을 수 있습니다. 진단 데이터 수집에 대한 자세한 내용은 Azure 진단을 사용하여 로깅 데이터 수집을 참조하십시오.

역할 인스턴스의 내부 끝점에 대한 포트 번호를 확인하려면 InstanceEndpoints 속성을 사용하여 끝점 이름과 해당 IP 주소 및 포트가 포함된 Dictionary 개체를 반환할 수 있습니다. IPEndpoint 속성은 지정된 끝점에 대한 IP 주소 및 포트를 반환합니다. PublicIPEndpoint 속성은 부하가 분산된 끝점에 대한 포트를 반환합니다. PublicIPEndpoint 속성의 IP 주소 부분은 사용되지 않습니다.

  1. 역할 인스턴스 데이터를 검색하는 데 사용할 원본 파일을 엽니다.

  2. 역할 인스턴스를 반복하는 코드를 추가합니다. 다음 코드 예제에서는 역할 인스턴스에 대한 식별자, 포트 및 IP 주소 정보를 쓰는 방법을 보여 줍니다.

    
    foreach (RoleInstance roleInst in RoleEnvironment.CurrentRoleInstance.Role.Instances)
    {
       Trace.WriteLine("Instance ID: " + roleInst.Id);
       foreach (RoleInstanceEndpoint roleInstEndpoint in roleInst.InstanceEndpoints.Values)
       {
          Trace.WriteLine("Instance endpoint IP address and port: " + roleInstEndpoint.IPEndpoint);
       }
    }
    
  3. 파일을 저장합니다.

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft