かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

WCF入門「Hello world」

WCFのハローワールドプログラム。

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

namespace WCFHelloWorld
{
    // インターフェースでWCFで提供するサービスを定義する

    // ServiceContractで、提供するサービスのメタ情報を定義する(とりあえずデフォのまま)
    [ServiceContract]
    public interface IWCFHello
    {
        // OperationContractでサービスの提供する機能を定義する
        [OperationContract]
        void Hello(string message);
    }

    // インターフェースを実装して、実際のサービスの中身を作りこむ
    public class WCFHello : IWCFHello
    {
        public void Hello(string message)
        {
            // とりあえずメッセージ出力する
            Console.WriteLine("HelloWorld Message: " + message);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            // WCFのサービスを起動するためには、以下の3つが必要
            // サービスのアドレス
            var address = new Uri("http://localhost:8888/IWCFHello");
            // バインディング
            var binding = new BasicHttpBinding();
            // コントラクト(ServiceContractのついたインターフェース)
            var contract = typeof(IWCFHello);

            // ServiceHostで、サービスをホストする。コンストラクタで、サービスの実装クラスを指定する
            var host = new ServiceHost(typeof(WCFHello));

            // アドレス、バインディング、コントラクトを指定する
            host.AddServiceEndpoint(
                typeof(IWCFHello),
                binding,
                address);
            try
            {
                // 起動!
                host.Open();
                Console.WriteLine("サービス開始");

                // サービスを呼ぶにはChannelFactoryでProxyを作成する
                // 呼ぶ側にも、アドレス、バンディング、コントラクトの指定が必要
                var ch = new ChannelFactory<IWCFHello>(
                    binding,
                    new EndpointAddress(address));

                // proxyを作ったら、普通にサービスを呼び出せる
                var proxy = ch.CreateChannel();
                proxy.Hello("こんにちは");


                Console.WriteLine("終了時にはEnterを押してください");
                Console.ReadLine();
                // 終了!
                host.Close();
            }
            catch
            {
                // よからぬことが起きたらAbort
                host.Abort();
            }
        }
    }

}

基本はここから始まる。
実行すると、以下のような結果になります。

サービス開始
HelloWorld Message: こんにちは
終了時にはEnterを押してください

続行するには何かキーを押してください . . .

これだけで、裏でXMLベースのメッセージがHTTPでやり取りされるようになってます。WCFHelloメッセージを以下のように書き換えると、メッセージの中身をのぞき見ることも出来ます。

// インターフェースを実装して、実際のサービスの中身を作りこむ
public class WCFHello : IWCFHello
{
    public void Hello(string message)
    {
        // とりあえずメッセージ出力する
        Console.WriteLine("HelloWorld Message: " + message);
        // 実際に送られてきたメッセージ
        var requestMessage = OperationContext.Current.RequestContext.RequestMessage;
        Console.WriteLine(requestMessage.ToString());
    }
}

これで実行しなおすと、以下のような結果になります。

サービス開始
HelloWorld Message: こんにちは
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8888/IWCFHello</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IWCFHello/Hello</Action>
  </s:Header>
  <s:Body>
    <Hello xmlns="http://tempuri.org/">
      <message>こんにちは</message>
    </Hello>
  </s:Body>
</s:Envelope>