티스토리 뷰

반응형

윈도우 폰 관련 서버 프로그램을 만드는 중으로 중간 단계 산출물을 간단하게 정리를 한번 하려고 한다.

서버 구성
1. 서버 기본 정보

1) Target framework : .NET Framework 4

2 ) References :
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="System.Data.Entity" />
    <Reference Include="System.Runtime.Serialization" />
    <Reference Include="System.Security" />
    <Reference Include="System.ServiceModel.DomainServices.EntityFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <Reference Include="System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Include="System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <Reference Include="System.ServiceModel.DomainServices.Server, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Include="System.Web.DynamicData" />
    <Reference Include="System.Web.Entity" />
    <Reference Include="System.Web.ApplicationServices" />
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Web.Extensions" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Web" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Web.Services" />
    <Reference Include="System.EnterpriseServices" />
    <Reference Include="System.Xml.Linq" />

3) Web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <sectionGroup name="system.serviceModel">
      <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DomainServiceModule" preCondition="managedHandler"
        type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </modules>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <system.web>
    <httpModules>
      <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </httpModules>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <connectionStrings>
    <add name="WP7ModelContainer"          connectionString="metadata=res://*/WP7Model.csdl|res://*/WP7Model.ssdl|res://*/WP7Model.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\WP7CE40.sdf&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.serviceModel>
    <domainServices>
      <endpoints>
        <add name="OData" type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </endpoints>
    </domainServices>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

2. SQL CE 4.0
1) Server Explorer에서 만들어서 App_Data 폴더에 넣어 놓았음
2) Entity Model을 통해서 모델 만들고, 쿼리 생성해서 sdf파일에 연결해서 테이블 생성 -> 잘 동작함
3) .Net Framework 4.0 상태에서 sdf 파일 오픈 정상, 읽기 정상

3. DomainService
1) Entity Model 실행 후 DomainService 추가시 이상한 오류 메세지 박스 하나 뜨는데 무시하고, 넘어가면 정상적으로 테이블 조회 해서 도메인 서비스 만드는 것 정상

2) 수정 사항

WP7DomainService.cs 파일에서 조회를 하는 쿼리를 수정

  /// <summary>
  /// 조회를 하면서 동시에 히스토리 데이터도 조회 한다.
  /// 점진적 로드를 위해 id로 정렬
  /// </summary>
  /// <returns></returns>
  [Query(IsDefault = true)]
  public IQueryable<WP7UriList> GetWP7UriListSet()
  {
      var query = (
                      (ObjectQuery<WP7UriList>)
                          from kkk in this.ObjectContext.WP7UriListSet
                          orderby kkk.Id
                          select kkk
                  ).Include("WP7History");
      //return this.ObjectContext.WP7UriListSet;
      return query.AsQueryable();
  }

metadata파일도 수정

  //연결데이터 함께 조회
  [Include]
  public EntityCollection<WP7History> WP7History { get; set; }

클라이언트 구성(Silverlight 5 RC)
그동안 Silverlight 5 beta 버전만 가지고 작업을 하다가, 이번에 RC를 깔고 처음 만들어 보는 실버라이트 프로젝트 ㅎㅎ

1. 클라이언트 기본 구성
1) Target Silverlight Version : Silverlight 5
2) References
  <Reference Include="Microsoft.Expression.Interactions, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="mscorlib" />
  <Reference Include="System.ComponentModel.DataAnnotations, Version=5.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217, processorArchitecture=MSIL" />
  <Reference Include="System.Reactive, Version=1.1.11011.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.Reactive.Providers, Version=1.1.11011.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.Reactive.Windows.Threading, Version=1.1.11011.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.Runtime.Serialization" />
  <Reference Include="System.ServiceModel" />
  <Reference Include="System.ServiceModel.DomainServices.Client, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.ServiceModel.DomainServices.Client.Web, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.ServiceModel.Web.Extensions, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.Windows" />
  <Reference Include="system" />
  <Reference Include="System.Core" />
  <Reference Include="System.Net" />
  <Reference Include="System.Windows.Controls, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <Reference Include="System.Windows.Controls.Data" />
  <Reference Include="System.Windows.Controls.Data.Input" />
  <Reference Include="System.Windows.Controls.DomainServices, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  <Reference Include="System.Windows.Controls.Input, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
  <Reference Include="System.Windows.Data" />
  <Reference Include="System.Windows.Interactivity" />
  <Reference Include="System.Xml" />
  <Reference Include="System.Windows.Browser" />

리퍼런스가 좀 만음. 쓸데 없는 것도 한두개 정도 있기는 하지만, 일단은 사용예정인 것 들도 있어서 나중에 정리 할 예정
Rx는 최신버전으로 설치 했음(1.1.11011.0)
나머지 리퍼런스는 대부분 Silverlight 5 SDK에 들어가 있는 것 같음

1) 서버에 정책 파일 만들어 주지 않았는데도, 접속하는데 문제 없음
2) Microsoft Expression Blend Preview for Silverlight5로 작업 문제 없음
- 한가지..유저컨트롤에 템플릿 생성했는데..오류가 한번 났음..음..일단 템플릿이 중요한 부분은 아니라 삭제하고 다시 작업함
2) 간단하게 SilverlightControl1.xaml 페이지 만들어서 테스트를 해봤는데 DataSource에서 드래그 드롭으로 화면에 추가해서, DomainDataSource로 작업하는 것도 정상 동작함
3) Model, ViewModel 추가
4) MainPage.xaml에서 메인 작업

2. WP7Model.cs

  /// <summary>
  /// 조건에 조회 하기
  /// 클라이언트에서 쿼리를 만들어서 서버에서 실행하고 결과 받음
  /// </summary>
  public void Getting(string condition, object sender)
  {
      //client-side query
      EntityQuery<WP7UriList> query = from wp in context.GetWP7UriListSetQuery()
                                      where (condition == null || wp.UserName.Contains(condition))
                                      orderby wp.UserName
                                      select wp;
      context.Load(query,
                  LoadBehavior.RefreshCurrent,
                  load =>
                  {
                      LoadComplet(load);
                  }, sender);

      //여긴 기존 방식 - 서버에 만들어져 있는 쿼리를 그냥 실행
      //context.Load(context.GetWP7UriListSetQuery(),
      //            LoadBehavior.RefreshCurrent,
      //            load =>
      //            {
      //                LoadComplet(load);
      //            }, sender);
  }

  //결과오면 처리하는 부분
  private void LoadComplet(LoadOperation load)
  {
      //마지막 호출한 오브젝트
      LastExecuteSender = load.UserState;
 
      if (load.HasError != true)
      {
          if (load.Entities.Count() > 0)
          {
              //반환된 데이터 타입을 가지고 데이터 구분해서 모델에 있는 컬렉션에 입력
              switch (load.Entities.FirstOrDefault().GetType().Name)
              {
                  case "WP7UriList":
                      WP7UriCollection = new ObservableCollection<WP7UriList>(load.Entities.Cast<WP7UriList>());
                      break;
                  case "WP7History":
                      WP7HistoryCollection = new ObservableCollection<WP7History>(load.Entities.Cast<WP7History>());
                      break;
              }
              MessageData = "조회 작업이 성공 했습니다.";
          }
          else
          {
              MessageData = "조회 결과가 없습니다.";
          }
      }
      else
      {
          MessageData = "조회 작업이 실패 했습니다.";
      }
  }

3. MainPageViewModel.cs

  private ICommand selectCommand;
  /// <summary>
  /// 조회 커맨드
  /// </summary>
  public ICommand SelectCommand
  {
      get
      {
          if (selectCommand == null)
          {
              selectCommand = new ActionCommand(() =>
              {
                  //조회 함수 호출
                  Model.Getting(null, this);
              });
          }
          return selectCommand;
      }
  }

4. MainPage.xaml

    <!--뷰모델 바로 입력해 버림-->
 <UserControl.DataContext>
  <WP7Host_ViewModels:MainPageViewModel/>
 </UserControl.DataContext>

    <!--폼로드시 SelectCommand 바로 실행-->
 <i:Interaction.Triggers>
  <i:EventTrigger>
   <i:InvokeCommandAction Command="{Binding SelectCommand, Mode=OneWay}"/>
  </i:EventTrigger>
 </i:Interaction.Triggers>

5. 실행 화면

 


 

반응형
댓글