自己ホスト型WCFサービスとWPFクライアントを使用したクライアントサーバアーキテクチャの構築方法
10981 ワード
どのような自己ホストWCFサービスですか?
セルフホスティングは、あなたのサービスをホストする最も簡単な方法であり、自己ホストされているのは、コンソールアプリケーションやウィンドウフォームなどであるアプリケーションでサービスをホストすることです.
WCFサービスをホストする方法.
インターネット情報サービス(IIS)でホストしている
サービス
ライブサービスを作成する手順
クライアント
WCFクライアントとサービスの通信には3つの手順があります.
では、プロジェクトを作成する手順を見てみましょう.
ステップ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には、セキュリティ、データコントラクト、サービス指向、トランザクションなどの他の機能があります.
Reference
この問題について(自己ホスト型WCFサービスとWPFクライアントを使用したクライアントサーバアーキテクチャの構築方法), 我々は、より多くの情報をここで見つけました https://dev.to/tarungurang/how-to-build-the-client-server-architecture-using-self-hosted-wcf-service-and-wpf-client-5dddテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol