자체 호스팅 WCF 서비스 및 WPF 클라이언트를 사용하여 클라이언트-서버 아키텍처를 구축하는 방법은 무엇입니까?

자체 호스팅 WCF 서비스란?



자체 호스팅은 서비스를 호스팅하는 가장 간단한 방법이며 자체 호스팅은 콘솔 응용 프로그램 또는 창 양식 등이 될 수 있는 응용 프로그램에서 서비스를 호스팅하는 것입니다.



WCF 서비스를 호스팅하는 방법.
  • 인터넷 정보 서비스(IIS)에서 호스팅.
  • 콘솔 또는 데스크탑 응용 프로그램에서 호스팅(자체 호스팅).

  • WCF 서비스에는 두 가지 유형의 영역이 있습니다.
  • 서비스
  • 클라이언트

  • 서비스



    라이브 서비스를 생성하기 위한 몇 가지 단계입니다.
  • 서비스 계약 정의
  • 서비스 계약 이행
  • 서비스 계약 호스팅 및 실행

  • 클라이언트



    WCF 클라이언트와 서비스 간에 통신하는 세 단계가 있습니다.
  • WCF 클라이언트를 만듭니다.
  • WCF 클라이언트를 구성합니다.
  • WCF 클라이언트를 사용합니다.
    이제 프로젝트를 만드는 단계를 살펴보겠습니다.


  • 1 단계

    Visual Studio를 열고 새 프로젝트를 만듭니다. 프로젝트 생성 후 솔루션 탐색기를 열고 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가 -> 새 항목 ->을 클릭하고 WCF 서비스 라이브러리를 선택하면 여기에 두 개의 파일이 생성됩니다. CompanyClass와 ICompanyClass는 이 두 파일입니다.


    2 단계

    이제 서비스 계약과 데이터 계약을 추가할 수 있습니다. 운영 계약에 대한 서비스 계약 및 데이터 구성원에 대한 데이터 계약.

    다음은 회사 클래스 모델입니다.

    using System;
    usingSystem.Collections.Generic;
    usingSystem.Linq;
    usingSystem.Runtime.Serialization;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    
    namespaceWCFExample
    {
        [DataContract]
      publicclassCompanyClass
        {
          [DataMember]
      publicstring CompanyName { get; set; }
          [DataMember]
      publicstring Address { get; set; }
          [DataMember]
      publicintCompanyYear{ get; set; }
    
      publicCompanyClass()
          {
    
          }
        }
    }
    


    이제 서비스 계약 및 운영 계약을 추가합니다.

    using System;
    usingSystem.Collections.Generic;
    usingSystem.Linq;
    usingSystem.ServiceModel;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    
      namespaceWCFExample
      {
        [ServiceContract]
      publicinterfaceICompanyService
        {
          [OperationContract]
      IList<companyclass>companyClasses();
    
          [OperationContract]
      voidUpdate(CompanyClass cc);
        }
    }
    </companyclass>
    


    자세히 보기: What Are The Different Ways Of Binding In Wpf?


    단계: 3

    이제 클래스에 서비스를 구현해야 합니다.

    using System;
    usingSystem.Collections.Generic;
    usingSystem.Linq;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    
    namespaceWCFExample
    {
    publicclassAddServices :ICompanyService
        {
      static List<companyclass>companyClasses = new List<companyclass>()
            {
          newCompanyClass() {CompanyName="Ifour", Address="Thaltej", CompanyYear=30},
          newCompanyClass() {CompanyName="TCS", Address="AgoraMall", CompanyYear=20},
          newCompanyClass() {CompanyName="Tencent", Address="S.G.Highway", CompanyYear=10},
          newCompanyClass() {CompanyName="TensorFlow", Address="Sola", CompanyYear=15},
          newCompanyClass() {CompanyName="Stridly", Address="Shivranjani", CompanyYear=14},
            };
    
      publicvoidUpdate(CompanyClass cc)
      {
          var data = companyClasses.FirstOrDefault(s =>s.CompanyName == cc.CompanyName);
          if (data!=null)
          {
            data.Address = cc.Address;
            data.CompanyYear = cc.CompanyYear;
          }
      }
    
      publicIList<companyclass>Classes()
        {
            returncompanyClasses;
        }
      }
    }
    </companyclass></companyclass></companyclass>
    



    usingSystem.ServiceModel;
    usingSystem.ServiceModel.Description;
    
    publicstaticvoid Main(string[] args)
        {
      using (ServiceHost host = newServiceHost(typeof(AddServices)))
            {
    
          ServiceMetadataBehaviorserviceMetadata  =newServiceMetadataBehavior { HttpGetEnabled = true };
          host.Description.Behaviors.Add(serviceMetadata);
    
    
          host.AddServiceEndpoint(typeof(AddServices), newNetTcpBinding { Security = { Mode = SecurityMode.None } }, nameof(AddServices));
    
          host.Open();
          Console.WriteLine("Services are hosted successfully.");
          Console.WriteLine("Press any key to stop the services.");
          Console.ReadKey();
            }
        }usingSystem.ServiceModel;
    usingSystem.ServiceModel.Description;
    
    publicstaticvoid Main(string[] args)
        {
      using (ServiceHost host = newServiceHost(typeof(AddServices)))
            {
    
          ServiceMetadataBehaviorserviceMetadata  =newServiceMetadataBehavior { HttpGetEnabled = true };
          host.Description.Behaviors.Add(serviceMetadata);
    
    
          host.AddServiceEndpoint(typeof(AddServices), newNetTcpBinding { Security = { Mode = SecurityMode.None } }, nameof(AddServices));
    
          host.Open();
          Console.WriteLine("Services are hosted successfully.");
          Console.WriteLine("Press any key to stop the services.");
          Console.ReadKey();
            }
        }
    


    단계: 4



    모든 서비스를 호스팅할 준비가 되었습니다. 이제 프로젝트를 실행하고 서비스가 성공적으로 호스팅되고 하나의 서비스 URL을 얻을 수 있는지 확인하십시오.

    이제 클라이언트를 만들고 해당 서비스를 사용하기 위한 WPF 프로젝트를 만들 수 있습니다.

    단계: 5



    WPF Windows 애플리케이션용 새 프로젝트를 만들고 MVVM 패턴을 사용하여 서비스를 사용합니다.

    먼저 WCF Company 서비스를 위한 프록시 채널을 생성해야 합니다. 이 프록시 개체를 사용하여 원하는 서비스 데이터를 얻을 수 있습니다.

    프록시를 생성하고 서버에서 데이터를 가져오는 방법을 살펴보겠습니다.

    using System;
    usingSystem.Collections.Generic;
    usingSystem.Linq;
    usingSystem.ServiceModel;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    
    namespaceWCFExample
    {
      publicclassProxyService<t>whereT :class
      {
        private T _GetT;
        public T GetT(string path)
        {
          return _GetT ?? (_GetT = ServiceInstance(path));
        }
    
        privatestatic T ServiceInstance(string path)
        {
          varbindpath = newNetTcpBinding();
          bindpath.Security.Mode = SecurityMode.None;
          EndpointAddressendpointAddress = newEndpointAddress(path);
    
          returnChannelFactory<t>.CreateChannel(bindpath, endpointAddress);
        }
      }
    }
    </t></t>
    
    




    단계: 6

    프록시 채널을 설정한 후 폴더를 생성하고 회사 모델에 대한 뷰 모델 이름을 지정하고 Xaml과 바인딩합니다.

    using System;
    usingSystem.Collections.Generic;
    usingSystem.Collections.ObjectModel;
    usingSystem.Linq;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    usingSystem.Windows.Input;
    
    namespaceWCFExample.ViewModel
    {
      publicclassCompanyViewModel
      {
        privatereadonlyICompanyServicecompanyService;
    
        publicCompanyViewModel()
        {
          ListData = newObservableCollection<companiesviewmodel>();
          varProxyservices = newProxyService<icompanyservice>();
          companyService = Proxyservices.GetT("net.tcp://localhost:9950/CompanyService");
          var companies = companyService.companyClasses();
    
          foreach (var company in companies)
          {
            ListData.Add(newCompaniesViewModel(company, this));
          }
        }
    
        publicObservableCollection<companiesviewmodel>ListData{ get; set; }
    
        publicvoidUpdateProperty(CompaniesViewModelcompaniesViewModel)
        {
          companyService.Update(companiesViewModel.Model);
        }
    
      }
    
      publicclassCommands :ICommand
      {
        private Action<object> action;
        privateFunc<object, bool="">func;
    
        publiceventEventHandlerCanExecuteChanged
        {
          add
          {
            CommandManager.RequerySuggested += value;
          }
          remove
          {
            CommandManager.RequerySuggested -= value;
          }
        }
    
        publicCommands(Action<object> action, Func<object, bool="">func = null)
        {
          this.action = action;
          this.func = func;
        } 
    
        publicboolCanExecute(objectparam)
        {
          returnthis.func == null || this.func(param);
        }
    
        publicvoidExecute(object param)
        {
          this.action(param);
        }
      }
    }
    </object,></object></object,></object></companiesviewmodel></icompanyservice></companiesviewmodel>
    


    고도로 숙련된 전문가WPF Developer와 대화를 원하십니까? 지금 연락하십시오.

    단계: 7



    이제 회사의 모든 세부 정보를 나타내는 보기 모델을 하나 더 추가합니다. 이 뷰 모델에서 우리는 즉각적인 업데이트를 위해 INotifyPropertyChanged를 암시합니다.

    usingJetBrains.Annotations;
    using System;
    usingSystem.Collections.Generic;
    usingSystem.ComponentModel;
    usingSystem.Linq;
    usingSystem.Runtime.CompilerServices;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    
    namespaceWCFExample.ViewModel
    {
      publicclassCompaniesViewModel :INotifyPropertyChanged
        {
        public Commands EventHandler{ get; privateset; }
    
        privatereadonlyCompanyViewModel _base;
        privatestring address;
        privateint year;
    
        publicCompanyClass Model;
    
        publicstring Address
            {
          get{ return address; }
          set
                {
            if(address != value)
            {
              address = value;
              Model.Address = value;
              _base.UpdateProperty(this);
              OnPropertyChanged(nameof(Address));
                    }
                }
            }
    
        publicint Year
        {
          get{ return year; }
          set
          {
            if(year != value)
            {
              year = value;
              Model.CompanyYear = value;
              _base.UpdateProperty(this);
              OnPropertyChanged(nameof(Year1));
              OnPropertyChanged(nameof(Year2));
              OnPropertyChanged(nameof(Year3));
              OnPropertyChanged(nameof(Year4));
              OnPropertyChanged(nameof(Year5));
                }
              }
            }
    
            publicbool Year1 =>Model.CompanyYear>= 30;
    
            publicbool Year2 =>Model.CompanyYear>= 20;
    
            publicbool Year3 =>Model.CompanyYear>= 10;
    
            publicbool Year4 =>Model.CompanyYear>= 15;
    
            publicbool Year5 =>Model.CompanyYear>= 14;
    
        publicCompaniesViewModel(CompanyClass company, CompanyViewModel companies)
            {
                Model = company;
          EventHandler = new Commands(OnClickYear);
                _base = companies;
                address = company.Address;
                year = company.CompanyYear;
            }
    
        privatevoidOnClickYear(objectobj)
            {
          this.Year = int.Parse(obj.ToString());
            }
    
          publiceventPropertyChangedEventHandlerPropertyChanged;
    
            [NotifyPropertyChangedInvocator]
          protectedvirtualvoidOnPropertyChanged([CallerMemberName] stringpropertyName = null)
            {
          PropertyChanged?.Invoke(this, newPropertyChangedEventArgs(propertyName));
            }
        }
    }
    




    결론

    WCF의 자체 호스팅은 사용하기 쉽습니다. 몇 줄의 코드를 사용하여 서비스를 실행하고 Service Host의 Open() 및 Close() 메서드를 통해 서비스를 제어할 수 있습니다. Window Communication Foundation은 .NET 프레임워크를 위한 안정적이고 안전하며 확장 가능한 메시징 플랫폼이며 보안, 데이터 계약, 서비스 지향, 트랜잭션 등과 같은 다른 기능을 가지고 있습니다.

    좋은 웹페이지 즐겨찾기