かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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>