【WCF】【C#】WCF ~ Hello World編 ~

■ はじめに

 * 実際には使えないが、WCF(Windows Communication Foundation)の感じをつかむには、
   以下の「構成」のようなシンプルなサンプルを作ってみるのは有意義であると思う

構成

サービス側
 * Windows Form (SampleWcfService)
  + label x 1
  + Formのイベント追加(Load、FormClosing)
クライアント側
 * Windows Form (SampleWcfClient)
  + button x 1
  + textBox x 2
  + label x 1

■ サンプル

前提条件

 * 「System.ServiceModel」を参照追加しておくこと
 * サービス側、クライアント側両方とも「管理者として実行」で実行されていること
  => Visual Studio で実行するなら、Visual Studioを「管理者として実行」で実行する

サービスの実装

 * プロジェクト「SampleWcfService」
Form1.cs
using System;
using System.ServiceModel;
using System.Windows.Forms;
using System.Diagnostics;

namespace SampleWcfService
{
  public partial class Form1 : Form
  {
    private ServiceHost host;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      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();
        this.label1.Text = "Start WCF service";
      }
      catch (Exception ex)
      {
        this.label1.Text = ex.Message;
      }
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
      if (this.host != null)
      {
        this.host.Close();
      }
    }
  }

  [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;
    }
  }
}

クライアントの実装

 * プロジェクト「SampleWcfClient」
Form1.cs
using System;
using System.ServiceModel;
using System.Windows.Forms;

namespace SampleWcfClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            EndpointAddress endpointAddress =
                new EndpointAddress("http://localhost:8888/SampleWcfService/Plus");

            using (ChannelFactory<ISampleWcfService> channel =
                new ChannelFactory<ISampleWcfService>(new BasicHttpBinding()))
            {
                ISampleWcfService 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);
    }
}

関連記事

WCF

WCF ~ 基礎知識編 ~
https://blogs.yahoo.co.jp/dk521123/22254537.html
WCF ~ App.configを付加 ~
https://blogs.yahoo.co.jp/dk521123/31874697.html
WCF ~ WCFJavaクライアントでアクセスする ~
https://blogs.yahoo.co.jp/dk521123/37962361.html

Windowsサービス

Windowsサービス ~ WCFでクライアント側と通信する ~
https://blogs.yahoo.co.jp/dk521123/37953369.html

その他

C#】イベントログ出力
https://blogs.yahoo.co.jp/dk521123/27253094.html