■ はじめに
https://blogs.yahoo.co.jp/dk521123/37948659.htmlで、簡単なWindowsサービスを作成できたので、 今度は、プロセス間通信(IPC:Inter Process Communication)を実現できる WCF(Windows Communication Foundation)を使って、 以下の「構成」のような「Windowsサービス - 他のアプリ」とのやり取りをする
構成
サービス側* Windows Service (WindowsService1)クライアント側
* Windows Form (SampleForm) + button x 1 + textBox x 2 + label x 1
■ サンプル
前提条件
* WCFを使うために「System.ServiceModel」を参照追加しておくこと * サービス側、クライアント側両方とも「管理者として実行」で実行されていること => Visual Studio で実行するなら、Visual Studioを「管理者として実行」で実行する
サービス側 (WindowsService1)
https://blogs.yahoo.co.jp/dk521123/37948659.htmlをベースにhttps://blogs.yahoo.co.jp/dk521123/31872515.html
のWCFの実装を組み込む。 => 「installutil WindowsService1.exe」でWindowsサービスをインストールし、 サービスとして開始させておく。Service1.cs
using System;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceProcess;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
private ServiceHost host;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Uri baseUri = new Uri(@"http://localhost:8888/SampleWcfService");
try
{
this.host = new ServiceHost(typeof(SampleWcfService), baseUri);
var binding = new BasicHttpBinding();
this.host.AddServiceEndpoint(typeof(ISampleWcfService), binding, "Plus");
this.host.Open();
EventLog.WriteEntry(String.Format("{0} : Starting Windows Service...", DateTime.Now));
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
protected override void OnStop()
{
EventLog.WriteEntry(String.Format("{0} : Stopping Windows Service...", DateTime.Now));
if (this.host != null)
{
this.host.Close();
}
EventLog.WriteEntry(String.Format("{0} : Done Windows Service...", DateTime.Now));
}
}
[ServiceContract]
public interface ISampleWcfService
{
[OperationContract]
int Plus(int value1, int value2);
}
public class SampleWcfService : ISampleWcfService
{
public int Plus(int value1, int value2)
{
Trace.WriteLine("Called me?");
return value1 + value2;
}
}
}
クライアント側 (SampleForm)
using System; using System.ServiceModel; using System.Windows.Forms; namespace SampleForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var endpointAddress = new EndpointAddress("http://localhost:8888/SampleWcfService/Plus"); using (var channel = new ChannelFactory<ISampleWcfService>(new BasicHttpBinding())) { var service = channel.CreateChannel(endpointAddress); int value1 = Convert.ToInt32(this.textBox1.Text); int value2 = Convert.ToInt32(this.textBox2.Text); this.label1.Text = service.Plus(value1, value2).ToString(); channel.Close(); } } } [ServiceContract] public interface ISampleWcfService { [OperationContract] int Plus(int value1, int value2); } }
動作確認
* Formを起動しTextBoxに「31」「12」を入れて、ボタン押下すると、 「43」と表示されるはず。
■ 補足:Javaでのアクセス
* WCF に Javaクライアントでアクセスする場合は、以下の関連記事を参照。WCF ~ WCF に Javaクライアントでアクセスする ~
https://blogs.yahoo.co.jp/dk521123/37962361.html
関連記事
Windowsサービス
Windowsサービス ~ 基礎知識編 ~https://blogs.yahoo.co.jp/dk521123/31702889.html
Windowsサービス ~ Hello World編 ~
https://blogs.yahoo.co.jp/dk521123/37948659.html
WCF
WCF ~ 基礎知識編 ~https://blogs.yahoo.co.jp/dk521123/22254537.html
WCF ~ Hello World編 ~
https://blogs.yahoo.co.jp/dk521123/31872515.html
WCF ~ WCF に Javaクライアントでアクセスする ~
https://blogs.yahoo.co.jp/dk521123/37962361.html