다음을 통해 공유


Advanced Web Programming

이 샘플에서는 WCF(Windows Communication Foundation) 웹 프로그래밍 모델의 몇 가지 고급 기능을 보여 주며, 다음과 같은 개념을 제공합니다.

  • URI 템플릿 디스패치 – 지정된 패턴과 일치하는 외부 URI에 서비스 작업을 바인딩할 수 있습니다.
  • HTTP 메서드 – GET, PUT, POST 및 DELETE를 비롯한 임의의 HTTP 메서드로 서비스 작업을 호출할 수 있습니다.
  • HTTP 헤더 – 서비스에서 WebOperationContext를 사용하여 HTTP 헤더 내용을 조작할 수 있습니다.

참고

이 샘플을 빌드하고 실행하려면 .NET Framework 버전 3.5가 설치되어 있어야 하며 프로젝트 및 솔루션 파일을 열려면 Visual Studio 2008이 필요합니다.

샘플에서는 메모리에 저장된 고객 데이터의 기본 컬렉션을 구현합니다. 또한 URI 및 HTTP 메서드를 사용하여 외부적으로 노출되는 기본 Create, Read, UpdateDelete 작업을 지원합니다.

서비스 계약 및 구현

이 샘플에서 서비스는 기본 URI 주소(https://localhost:8000/Customers)에서 수신 대기하는 단일 끝점을 구현합니다. 서비스는 다음과 같은 방식으로 해당 접두사 아래의 URI에 대한 요청을 처리합니다.

  • https://localhost:8000/Customers에 대한 GET 요청은 GetCustomers()로 라우트됩니다.
  • 시스템의 각 고객에게는 URI로 전달되는 고유 식별자가 있습니다. 이러한 URI(예: https://localhost:8000/Customers/1)에 대한 GET 요청은 GetCustomer()로 매핑됩니다.
  • 고객의 URI에 대해 HTTP PUT 요청을 실행하여 각 고객을 업데이트할 수 있습니다.
  • 고객의 URI에 대해 HTTP DELETE를 실행하여 시스템에서 고객을 제거할 수 있습니다.
  • 기본 URI에 대해 HTTP POST를 실행하여 시스템에 새 데이터를 추가할 수 있습니다.
[ServiceContract]
public interface ICustomerCollection
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "")]
    Customer AddCustomer(Customer customer);

    [OperationContract]
    [WebInvoke(Method = "DELETE", UriTemplate = "{id}")]
    void DeleteCustomer(string id);

    [OperationContract]
    [WebGet(UriTemplate = "{id}")]
    Customer GetCustomer(string id);

    [OperationContract]
    [WebGet(UriTemplate = "")]
    List<Customer> GetCustomers();

    [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "{id}")]
    Customer UpdateCustomer(string id, Customer newCustomer);
}

서비스 계약은 WCF 단일 인스턴스를 사용하는 Service 클래스에 의해 구현됩니다. 수신된 모든 요청은 서버의 동일한 개체 인스턴스로 라우트되어 요청 간에 고객의 해시 테이블을 공유할 수 있습니다.

[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]
public class Service : ICustomerCollection
{
   Hashtable customers = new Hashtable();
   ...
}        

GetCustomers() 작업은 서비스의 기본 URI(예: https://localhost:8000/Customers)에 대해 HTTP GET 요청을 실행하여 호출할 수 있습니다. Customer 형식은 Data Contract Serializer로 serialize됩니다.

public List<Customer> GetCustomers()
{
    List<Customer> list = new List<Customer>();

    foreach (Customer c in this.customers.Values)
    {
        list.Add(c);
    }

    return list;
}

고객의 고유한 URI에 대해 GET 요청을 실행하여 각 고객을 검색할 수 있습니다. 예를 들어 ID가 1인 고객은 https://localhost:8000/Customers/1에서 검색할 수 있습니다. 마찬가지로 고객 2는 http:/localhost:8000/Customers/2에서 액세스할 수 있습니다. 두 URI는 모두 서버의 GetCustomer(string id) 메서드로 디스패치됩니다. 이러한 매핑은 GetCustomer() 작업 계약에 적용되는 [WebGet( UriTemplate="{id}")] 특성에 의해 만들어집니다. UriTemplateGetCustomer() 작업에서 처리하는 URI 집합을 설명하는 패턴입니다. 이런 경우 패턴에서는 끝점의 기본 주소 다음에 정확히 한 세그먼트가 있는 모든 URI를 설명합니다. 해당 세그먼트의 내용은 {id} 템플릿 변수와 일치하며 WCF 디스패처에 의해 메서드 매개 변수 id로 전달됩니다.

//[WebGet( UriTemplate=”{id}” )]
public Customer GetCustomer(string id)
{
    Customer c = this.customers[id] as Customer;
      
    if (c == null)
    {
        WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound();
        return null;
    }

    return c;
}

GetCustomer()를 구현하면 URI로 제공되는 고객 ID가 조회되고 관련 고객이 반환됩니다. 해당 고객이 없으면 작업에서 WebOperationContext 메서드로 HTTP 404 응답을 반환하고 응답 상태 코드를 설정합니다.

또한 UpdateCustomer()DeleteCustomer() 메서드는 GetCustomer() 메서드와 동일한 URI 템플릿에 연결됩니다. WCF 웹 프로그래밍 모델에서는 각 작업이 서로 다른 HTTP 메서드와 연결되는 한 여러 작업을 동일한 URI 템플릿에 바인딩할 수 있습니다. 이런 경우 UpdateCustomer() 메서드는 HTTP PUT 메서드에 바인딩되고 DeleteCustomer() 작업은 HTTP DELETE 메서드에 바인딩됩니다.

[OperationContract]
[WebInvoke( Method="PUT", UriTemplate="{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);

[OperationContract]
[WebInvoke( Method="DELETE", UriTemplate="{id}" )]
void DeleteCustomer(string id);

AddCustomer() 메서드에서는 새 UriTemplate 클래스를 사용하여 특정 패턴을 따르는 새 URI를 만드는 방법을 보여 줍니다. WebOperationContext() 메서드는 location 헤더가 새로 만든 고객의 URI로 설정된 HTTP CREATED 응답을 반환하는 데 사용됩니다.

public Customer AddCustomer(Customer customer)
{
    lock (writeLock)
    {
        counter++;
        UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;

        UriTemplate template = new UriTemplate("{id}");
        customer.Uri = template.BindByPosition(match.BaseUri, counter.ToString());

        customers[counter.ToString()] = customer;
        WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(customer.Uri);
    }

    return customer;
}

서비스 호스팅

서비스는 WebServiceHost()를 사용하여 호스팅되고 한 끝점은 WebHttpBinding()을 사용하여 노출됩니다.

using (WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("https://localhost:8000/Customers")))
{
    //WebServiceHost will automatically create a default endpoint at the base address using the WebHttpBinding
    //and the WebHttpBehavior, so there's no need to set it up explicitly
    host.Open();
    ...
}

클라이언트

클라이언트는 원격 서비스에 대한 채널을 만드는 WebChannelFactory 메서드를 사용하여 만듭니다.

using (WebChannelFactory<ICustomerCollection> cf = new WebChannelFactory<ICustomerCollection>( baseAddress ))
{
    //WebChannelFactory will default to using the WebHttpBinding with the WebHttpBehavior,
    //so there's no need to set up the endpoint explicitly
    ICustomerCollection channel = cf.CreateChannel();
    ...
}

채널을 사용하는 클라이언트는 서비스에 대해 일련의 요청을 실행하여 고객 컬렉션의 상태를 조작합니다.

출력

POST로 일부 고객 추가:

Alice 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2

PUT을 사용하여 고객 업데이트:

Charlie 123 Pike Place https://localhost:8000/Customers/1

GET을 사용하여 고객 목록 검색:

Charlie 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2

DELETE를 사용하여 고객 삭제:

최종 고객 목록:

Charlie 123 Pike Place https://localhost:8000/Customers/1

상호 작용이 완료되면 프로그램은 키 입력을 기다린 후 종료됩니다.

샘플을 설치, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.

  2. C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Windows Communication Foundation 샘플 빌드의 지침을 따릅니다.

  3. 단일 컴퓨터 또는 다중 컴퓨터 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플 실행의 지침을 따릅니다.

참고 항목

작업

Basic Web Programming Model 샘플

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.