WCF (Windows Communication Foundation)

WCF는 SOA (Service Oriented Architecture)를 구축할 수 있는 닷넷 프레임워크의 중요한 요소입니다.

서버와 클라이언트 간의 통신을 매우 쉽게 할 수 있습니다.

서버에서는 WCF를 이용해 서비스를 제공하고, 클라이언트에서는 프록시(Proxy, 대리인)코드를 이용해 서버에서 제공하는 서비스를 이용하는 아키텍쳐를 가지고 있습니다.

 

* 프록시코드

WCF는 서버와 클라이언트간의 통신을 위해 SOAP(Simple Object Access Protocol, XML기반)을 이용합니다. 그러면 프로그래머는 서버의 서비스를 이용하기 위해 XML을 파싱하는 귀찮은 작업을 해야 합니다.

이러한 작업을 피하기 위해 비주얼 스튜디오에서는 프로그래머 대신 XML을 파싱하는 코드(클래스)를 자동으로 생성하는 기능을 가지고 있습니다.

 

어떤 객체의 메서드를 호출 한다고 했을 때, 프록시가 그 객체인 것처럼 그 호출을 받으므로, 필요한 전처리를 실행할 수도 있고, 실제 메서드를 호출하거나 호출하지 않고도 결과를 반환할 수도 있습니다.  

 

 

WCF 서비스 구축하기

프로젝트의 Web부분에서 추가-새 항목 - 웹서비스를 클릭하여 선택 한 후, 

이름에 Test.asmx를 입력합니다.

 

Test.asmx

<%@ WebService Language="C#" CodeBehind="Test.asmx.cs" Class="WCFTest.Web.Test" %> 

 

Test.asmx.cs

namespace WCFTest.Web
{
 [WebService(Namespace = "http://tempuri.org/")]
 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 [System.ComponentModel.ToolboxItem(false)]
 public class Test : System.Web.Services.WebService
 {
  [WebMethod]
  public string HelloWorld()
  {
   return "Hello World";
  }
  [WebMethod]
  public int Add(int num1, int num2)
  {
   return num1 + num2;
  }
 }
}

 

프록시 코드 생성하기

실버라이트 프로젝트에서 마우스 오른클릭해서 서비스 참조 추가 클릭합니다.

http://localhost:포트/Test.asmx 입력 / 혹은
검색을 클릭하면 현재 등록된 웹서비스의 주소를 자동으로 입력합니다.

그리고 확인 버튼을 클릭하면 프록시 코드 생성을 시작합니다.

완료되면 ServiceReference1이 추가됩니다.

 

실버라이트에서 웹 서비스 이용하기

MainPage.xaml

<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
 <TextBox x:Name="tbNum1" FontSize="20"/>
 <TextBlock Text=" + " FontSize="20"/>
 <TextBox x:Name="tbNum2" FontSize="20"/>
 <TextBlock Text=" = " FontSize="20"/>
 <TextBlock x:Name="tbResult" FontSize="20"/>
 <Button x:Name="btCalculate" Content="계산하기" Margin="20, 0, 0, 0" Height="23"/>
</StackPanel>


MainPage.xaml.cs 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using WCFTest.ServiceReference1;
namespace WCFTest
{
 public partial class MainPage : UserControl
 {
  public MainPage()
  {
   InitializeComponent();
   // Client 이벤트 핸들러 설치
   btCalculate.Click += 
    new RoutedEventHandler(Calculate);
  }
  void Calculate(object sender, RoutedEventArgs e)
  {
   // 계산할 수를 가져옴
   int num1 = Convert.ToInt32(tbNum1.Text);
   int num2 = Convert.ToInt32(tbNum2.Text);
   // 웹서비스 호출을 위한 Client 생성
   // 프록시 코드에서 자동 생성된 클래스
   TestSoapClient client = new TestSoapClient();
   // ASync로 작동하기 때문에 AddCompleted 이벤트 핸들러 설치
   client.AddCompleted += new EventHandler<AddCompletedEventArgs>(AddCompleted);
   // Add 서비스 호출
   client.AddAsync(num1, num2);
  }
  void AddCompleted(object sender, AddCompletedEventArgs e)
  {
   // Add 결과 받음
   int result = e.Result;
   // 화면에 반영
   tbResult.Text = result.ToString();
  }
 }
}

 

웹서비스에서의 보안정책

WebClient와 동일하게 보안 정책 파일이 필요