いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

WCF入門-004 (基本的なサンプル, 構成ファイルを利用, バインディングにNamedPipe(名前付きパイプ)を利用)


前回では、バインディングにNetTcpBindingを利用していましたが
今回は、名前付きパイプ(NetNamedPipeBinding)を利用してみます。


名前付きパイプは、同一コンピュータ内でしか利用できませんが
WCFで利用できるバインディングの中で最も速度が速いとのこと。


注意点として、名前付きパイプを利用する場合ポート番号の指定は必要ありません。
構成ファイルにも指定する必要はありません。


名前付きパイプを利用する場合は、以下の組み合わせを利用します。


以下、サンプルです。
といっても、前回のサンプルとほぼ同じです。
HttpからTcpに変更したときのように構成ファイル内のアドレスを変更するのみですみます。

まずサービス定義.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;

namespace Gsf.Samples.WCF
{
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        string SayHello(string name);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;

namespace Gsf.Samples.WCF
{
    public class MyService : IMyService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello '{0}'", name);
        }
    }
}


次にホストアプリ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;

namespace Gsf.Samples.WCF
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var host = new ServiceHost(typeof(MyService)))
            {
                host.Open();

                Console.WriteLine("サービスが開始されました。");
                Console.WriteLine("press <ENTER> to exit...");
                Console.ReadLine();

                host.Close();
            }
        }
    }
}


ホスト側のアプリケーション構成ファイル。
アドレスの部分にて、名前付きパイプ(NamedPipe)を指定しています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Gsf.Samples.WCF.MyService">
        <host>
          <baseAddresses>
            <!-- NamedPipeの場合ポート番号の指定は必要ない。-->
            <add baseAddress="net.pipe://localhost/WCFSample004/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="netNamedPipeBinding" contract="Gsf.Samples.WCF.IMyService" />
      </service>
    </services>
  </system.serviceModel>
</configuration>


次にクライアント側。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;

namespace Gsf.Samples.WCF
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnCallServiceMethod_Click(object sender, RoutedEventArgs e)
        {
            using (var client = new MyServiceRef.MyServiceClient())
            {
                txbResult.Text = client.SayHello("WCF Study");
                client.Close();
            }
        }
    }
}


最後にクライアント側のアプリケーション構成ファイル。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <client>
          <!-- NamedPipeの場合ポート番号の指定は必要ない。-->
          <endpoint address="net.pipe://localhost/WCFSample004/MyService" 
                    binding="netNamedPipeBinding" 
                    contract="MyServiceRef.IMyService" />
        </client>
    </system.serviceModel>
</configuration>


実行すると以下のようになります。


サンプルは以下の場所にアップしてあります。
https://sites.google.com/site/gsfzero1/Home/WCF-Sample-004.zip?attredirects=0&d=1


================================
過去の記事については、以下のページからご参照下さい。