GSI


저번 강좌 까지 해서 DB 만들고, 웹 서비스 까지 기본으로 만들어 봤습니다.
여기서 해볼건 실버라이트 프로젝트에 웹 서비스로 등록 해 놓은 서비스를 추가 하고 바인딩 하는걸 해볼께요.

우선 기본 코드를 작성 합니다.
-- page.xaml--
<UserControl x:Class="TestBoard.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <UserControl.Resources>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="0.852*"/>
            <RowDefinition Height="0.148*"/>
        </Grid.RowDefinitions>
        <ListBox Width="Auto" Margin="2,2,2,2" x:Name="boardList" Grid.Row="1"  />
        <Button HorizontalAlignment="Left" Margin="2,2,0,2" Width="100" Content="Load Test" Click="Button_Click" />
        <TextBox Margin="2,8,146,8" Grid.Row="2" Text="TextBox" TextWrapping="Wrap" d:LayoutOverrides="Height" x:Name="TextValue"/>
        <Button HorizontalAlignment="Right" Margin="0,8,40,8" Width="102" Grid.Row="2" Content="Input" Click="Input_Click"/>
    </Grid>
</UserControl>
-- page.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;
namespace basicBoard01
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
        }

        public void Read2()
        {
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
        }

        private void Input_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}


위의 기본 코드는 아래의 화면처름 나오게 됩니다.

이제 작업을 시작해 볼께요.

서비스 참조 추가를 통해서 웹서비스를 게시한 주소를 추가한 다음에 참조를 추가 합니다.


추가한 다음에 다음과 같이 구성해 봤습니다.
"Input" 버튼을 누르면 TextBox의 값이 웹 서비스 메소드를 통해서 DB에 저장되고 완료된 후 메소드가 호출되면 ListBox에 해당 DB 리스트 정보가 보이도록 해봤습니다.

"Input" 버튼의 Click 이벤트 메소드에 아래와 같이 작성합니다.

        private void Input_Click(object sender, RoutedEventArgs e)
        {
            boardService.Service1SoapClient client =
                new basicBoard01.boardService.Service1SoapClient();

            client.AddValueCompleted += new EventHandler<basicBoard01.boardService.AddValueCompletedEventArgs>(client_AddValueCompleted);
            client.AddValueAsync(TextValue.Text);
        }

위의 코드의 내용은 웹 서비스의 Client 객체를 생성하고 웹 서비스에서 값을 추가 하기 위해서 AddValue(string value) 에 해당하는 메소드 AddValueAsync()를 호출해 줍니다.
이때 완료된 후 콜백 형태로 받기 위해서 AddValueCompleted() 라는 이벤트 함수를 하나 추가 합니다.

        void client_AddValueCompleted(object sender, basicBoard01.boardService.AddValueCompletedEventArgs e)
        {
            Read2();
        }

위와 같이 값을 DB에 기록한 후 완료가 되면 Read2()를 호출해서 값을 ListBox에 뿌리도록 했습니다.

        public void Read2()
        {
            boardService.Service1SoapClient client =
                new basicBoard01.boardService.Service1SoapClient();

            client.GetListCompleted += new EventHandler<basicBoard01.boardService.GetListCompletedEventArgs>(client_GetListCompleted);

            client.GetListAsync();
        }


마무리...
조금 장황하게 설명을 해봤지만 역시나 좀 두서가 없네요 ^^.
우선 확인되는 부분은 웹 서비스에서 AddValue, GetList 등의 메소드를 만들어 놓고 나서
웹 서비스를 참조 추가를 해서 보게 되면 위와 같이 항상 두개의 메소드가 생성 됩니다.

GetList 인 경우를 보게 되면 리턴만 받는것이기 때문에 GetListAsync() 라는 메소드만 호출하면 됩니다.
이때 호출후 리턴되는 데이터를 받는건 GetListCompleted 라는 이벤트 함수가 담당 하게 됩니다.

AddValue 인 경우를 보게 되면 리턴도 받지만 값을 인자로 받게 되는데요 AddValueAsync(TextValue.Text) 와 같이 해당 스트링 값을 입력 할 수 있게 됩니다.
이때도 AddValueCompleted 를 통해서 결과를 확인할 수 있습니다. 에러가 났는지 정상인지를 판단할 수 있다고 보여 집니다.

잘 적지는 못했지만 실버라이트에서 웹 서비스를 통해서 바인딩 하는 부분에서는 조금 접근한듯 합니다.
조금이나마 도움이 되면 좋겠네요 ^^.

지적질, 질문질 다 환영해요 ^^

Posted by gsi
:


step 1에서 기본 프로젝트를 생성 했습니다.
DB 테이블도 생성 했구요.
이제 할일은 실버라이트 프로젝트랑 DB를 연결 시켜줄 웹 서비스를 구성하는 일입니다.

웹 서비스 제작

  1. 웹 서비스 프로젝트 생성
    1. Visual C# > Web > ASP.NET 웹 서비스 응용 프로그램 을 누릅니다.
    2. 이름은 boardService로 정했습니다.
    3. 아래와 같은 프로젝트가 하나 생성 됩니다.
      이제 프로젝트가 만들어 졌으니 DB를 가져 오는 부분을 추가하고 DB 내용을 담아서 실버라이트로 넘기기 위해서 클래스를 하나 제작 합니다.
  2. DB 바인딩
    1. 데이터 집합 을 하나 생성합니다. 이름은 "dsBoard"로 정했습니다.
    2. DB 를 바인딩 하기 위해서 저 같은 경우는 서버 탐색기를 이용 합니다.
      서버 탐색기 창에서 이전 강좌에서 만들어 놓은 board 데이터 베이스를 바인딩 합니다.
      ( 이 부분 설명은 우선 생략 할께요.)
    3. 위의 memo 테이블을 dsBoard.xsd 파일의 화면으로 드래그 해서 놓으면 테이블 내용이 포함됩니다.
  3. Data.cs 클래스 파일 생성
    1. 이제 DB 연결이 준비 되었으니 위의 데이터를 받아 들일 클래스를 하나 제작했습니다.
      이름은 Data.cs 파일로 클래스 파일을 준비 하구요.
      내용은 아래와 같이 Value를 프로퍼티로 구성했어요.
  4. 웹 서비스로 노출할 메소드를 정의 하고 아래와 같이 코드를 추가 했습니다.
    1. 메소드는 리스트를 리턴해 주는 것과 해당 값을 입력 받는 메소드를 정의하고 아래와 같이 코드를 추가 했습니다.

       using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.Services;

      namespace boardService
      {
          /// <summary>
          /// Service1의 요약 설명입니다.
          /// </summary>
          [WebService(Namespace = "http://tempuri.org/")]
          [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
          [System.ComponentModel.ToolboxItem(false)]
          // ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다.
          // [System.Web.Script.Services.ScriptService]
          public class Service1 : System.Web.Services.WebService
          {
              [WebMethod]
              public string GetDate()
              {
                  return DateTime.Now.ToString();
              }

              [WebMethod]
              public List<Data> GetList()
              {
                  List<Data> datas = new List<Data>();

                  dsBoardTableAdapters.memoTableAdapter adapter = new boardService.dsBoardTableAdapters.memoTableAdapter();
                  dsBoard.memoDataTable table = new dsBoard.memoDataTable();

                  adapter.Fill(table);

                  foreach (dsBoard.memoRow row in table.Rows)
                  {
                      datas.Add(new Data(row.value.ToString()));
                  }

                  return datas;
              }

              [WebMethod]
              public bool AddValue(string value)
              {
                  try
                  {
                      dsBoardTableAdapters.memoTableAdapter adapter = new boardService.dsBoardTableAdapters.memoTableAdapter();
                      adapter.Insert(value);
                  }
                  catch (Exception ex)
                  {
                      return false;
                  }
                  return true;
              }
          }
      }

위와 같이 구성하고 localhost에 게시를 해서 하나 등록을 해 놨습니다.
이제 다음 강좌에서는 실버라이트에서 화면을 구성하고, 데이터를 연동하는 곳을 해볼께요.
위의 웹 서비스를 테스트 하고 하는 부분들은 설명이 좀 길어 질거 같아서 추가를 하지 않았습니다.
이 부분은 웹 서비스 관련 책에 많이 나오기 때문에 생략 했습니다.

Posted by gsi
:

실버라이트와 웹 서비스를 연동해서 DB의 값을 바인딩 하는 부분을 한번 해보고 있습니다.
블랜드나 기타 XAML에서 바인딩 하는건 사실 잘 못하겠구요 ^^
그래서 비하인드 코드에서 바인딩 하는 것을 테스트 해보았습니다.

주제 : 기본 프로젝트 생성, DB 테이블 생성

  1. 프로젝트 생성
    1. Visual C#>Silverlight>Silverlight 응용 프로그램 을 클릭한다.
    2. 테스트를 위해서 "솔루션에 Silverlight를 호스팅할 새 ASP.NET 웹 프로젝트 추가" 를 선택한다.
    3. 두개의 프로젝트가 생겼다. 대충 봐도 하나는 기존 WPF 형태의 프로젝트이고, 다른 하나는 웹 페이지를 표시하는거 같다.
    4. 이제 준비 작업은 끝났으니 작업을 시작해 볼께요.
  2. DB 테이블 생성
    1. DB 테이블 생성

      - 데이터 베이스 이름은 "board"로 정했고, "테이블 이름은 "memo"라고 정했다.
      - 그리고 idx 은 인덱스를 의미 하며, 1씩 증가 하도록 설정하였다.
      - 이 부분은 다 알고 있다고 가정하고 그냥 DB 부분은 스킵 ^^
Posted by gsi
:

오늘 세미나는 나름대로 생각을 많이 하게 해주는 좋은 시간이였던거 같습니다.

우선 Silverlight를 ASP.NET AJAX와 연동해서 화면 구성을 얼마나 극대화 하게 해주는지를
보는 좋은 예가 되었으며,
Silverlight를 활용한 동영상 부분은 기존에도 봐왔지만. asp.net를 배우는 시점에서
어떻게 적용하고 동영상 컨텐츠로서의 발전 가능성에서도 조금씩 생각의 틀을
잡아 주는 시간이였던거 같습니다.

Web Service의 활용 가치에 대해서도 조금씩 이해가 가네요.
실버라이트가 1.1을 바라보고 있는 가운데 많은 부분 업데이트가 되고
다양한 적용 사례가 나올거 같습니다.
내년이 기대가 되네요.

기존 디자이너의 일러 스터에서의 디자인 방법을 그대로 가져 갈 수 있도록
XAML Export도 제공한다고 하니 Blend를 배우지 않아도 협업 과정에서
조금은 가능성이 보이네요 ^^.

지금 구상중인 제 웹 페이지도 ASP.NET AJAX를 기본 구성으로 가지만
궁극적인 목표는 WPF, Silverlight의 접목에 있기 때문에
많은 고민을 해야 할거 같습니다.

모두 하루하루. 즐거운 날로 가득 찼으면 좋겠네요.

^^

Posted by gsi
: