自己ホスト型WCFサービスとWPFクライアントを使用したクライアントサーバアーキテクチャの構築方法


どのような自己ホストWCFサービスですか?


セルフホスティングは、あなたのサービスをホストする最も簡単な方法であり、自己ホストされているのは、コンソールアプリケーションやウィンドウフォームなどであるアプリケーションでサービスをホストすることです.

WCFサービスをホストする方法.
インターネット情報サービス(IIS)でホストしている
  • .
  • コンソールまたはデスクトップアプリケーション(自己ホスティング)で
  • ホスティング.
  • WCFサービスには2種類のゾーンがあります.
  • サービス
  • クライアント
  • サービス


    ライブサービスを作成する手順
  • はサービス契約
  • を定義します
  • サービスコントラクト
  • を実装する
  • をホストして、サービス契約
  • を走らせてください

    クライアント


    WCFクライアントとサービスの通信には3つの手順があります.
  • WCFクライアントを作成します.
  • WCFクライアントを設定します.
  • WCFクライアントを使用します.
    では、プロジェクトを作成する手順を見てみましょう.

  • ステップ1
    Visual Studioを開き、新しいプロジェクトを作成します.プロジェクトの作成後、ソリューションエクスプローラーを開き、プロジェクト名を右クリックし、[追加->新しい項目->]をクリックし、WCFサービスライブラリを選択します.

    ステップ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


    すべてのサービスをホストする準備が整いました.さて、プロジェクトを実行し、サービスが正常にホストされていることを確認し、1つのサービスURLを取得できます.
    今、クライアントを作成し、サービスを消費するためのWPFプロジェクトを作成できます.

    ステップ5


    WPF Windowsアプリケーションの新しいプロジェクトを作成し、MVVMパターンを使用してサービスを使用します.
    まず最初に、我々はWCF会社サービスのためにプロキシチャンネルを作成しなければなりません.このプロキシオブジェクトを使用すると、必要なサービスデータを取得できます.
    プロキシを作成し、サーバーからデータを取得する方法を見てみましょう.
    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


    今、会社のすべての詳細を表すためのもう一つのビューモデルを追加します.このビューモデルでは、即座にUptifyPropertyChangedを即座に更新します.
    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で自己ホスティングは、あなたのサービスをいくつかの行のコードを使用して実行することができますを使用するのは簡単ですが、サービスホストのオープン(および)メソッドを介してあなたのサービスを制御することができます.Windows Communication Foundationは、信頼できる、安全で、スケーラブルなメッセージングプラットフォームです.NET Frameworkには、セキュリティ、データコントラクト、サービス指向、トランザクションなどの他の機能があります.