WCF最初の一歩

と題しまして、じぇんじぇんわからないのでまずはチュートリアル的なものをやってみます。
お題はMSDNWindows Communication Foundation チュートリアル入門を使います。

基本的なWCFサービスと呼び出しを作る6つのタスク

  • サービスコントラクトを定義する
  • サービス コントラクトを実装する
  • 基本的なサービスをホストおよび実行する
  • クライアントを作成する
  • クライアントを構成する
  • クライアントを使用する

と言われてもどうすればいいのかサッパリわかりませんよと。
では順番にやっていきます。

とりあえずプロジェクトを作る

チュートリアルではコンソールアプリとして作っています。
参照設定にSystem.ServiceModelを追加する以外は普通のコンソールアプリです。

サービス コントラクトを定義する

まずは作成するサービスの内容をインターフェースで定義するみたいです。
Service.csファイルを新規作成し、以下のように記述します。

using System;
using System.ServiceModel;

namespace SuperlightBrothers.Samples {
    [ServiceContract(Namespace = "http://SuperlightBrothers.Samples")]
    public interface ICalculator {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }
}
付加した属性について

簡単に言うとこんな感じ(?)

ServiceContractAttribute WCFサービスを提供するという定義
OperationContractAttribute WCFサービスの操作を提供するという定義

ServiceContractに付けてるNameSpaceチュートリアルに従ってつけているだけです。

サービス コントラクトを実装する

次に定義したサービスインターフェースの実装を作ります。今回はチュートリアルに従って同じファイルに記述します。

using System;
using System.ServiceModel;

namespace SuperlightBrothers.Samples {
    [ServiceContract(Namespace = "http://SuperlightBrothers.Samples")]
    public interface ICalculator {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }

    public class CalculatorService : ICalculator {
        public double Add(double n1, double n2) {
            return n1 + n2;
        }

        public double Subtract(double n1, double n2) {
            return n1 - n2;
        }

        public double Multiply(double n1, double n2) {
            return n1 * n2;
        }

        public double Divide(double n1, double n2) {
            return n1 / n2;
        }
    }
}

基本的なサービスをホストおよび実行する

次にWCFサービスをホストしてみるみたいです。チュートリアルではとりあえずHTTPでセルフホストするようです。
他にもサービスの提供方法はTCPやMSMQとかいろいろあるみたい。ホストもセルフ以外にIISとかでもできるみたい。
コンソールアプリプロジェクト生成時に追加されたProgram.csファイルを以下のように編集します。

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

namespace SuperlightBrothers.Samples {
    class Program {
        static void Main(string[] args) {
            var selfHost = new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8000/ServiceModelSample/Service"));

            try {
                selfHost.AddServiceEndpoint(
                    typeof(ICalculator),
                    new WSHttpBinding(),
                    "http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
                );
                ServiceMetadataBehavior serviceMetadataBehavior = new ServiceMetadataBehavior() { HttpGetEnabled = true };
                selfHost.Description.Behaviors.Add(serviceMetadataBehavior);

                selfHost.Open();

                Console.WriteLine("Enterキーで終了");
                Console.ReadLine();

                selfHost.Close();

            } catch (CommunicationException ex) {
                Console.WriteLine(ex.Message);
                selfHost.Abort();
            }
        }
    }
}

言われるままに記述。BehaviorのServiceへの追加方法がチュートリアルに記述されていないので注意。たぶんこれでいいはず。

ホストの手順(チュートリアルのまま)
  1. ServiceHostインスタンスを作成。サービスコントラクトの実装クラスの型と、ホストするベースのアドレス(URI)を引数に与える。
  2. ServiceHostにエンドポイントを追加。エンドポイントでは「どのサービスコントラクトを」「どの形式でネットワークに公開し」「どの場所で提供するか」を指定します。(今回はチュートリアルのなすがまま)
  3. メタデータ交換を有効にするため、サービスメタデータの動作を追加。(サービスの動作についてはよくわからないため補足無しで0;)
  4. ホストオープン
  5. ストクローズ
実行する

この段階で実行し、ブラウザでhttp://localhost:8000/ServiceModelSample/Serviceを見ると、『CalculatorService サービス』のサービスを作成した内容とクライアントの作成方法が書かれたページが表示される。
公開方法にWsHttpBindingを指定したためだと思うが、WSDLまで自動生成できるようになってた。すげぇな。

とりあえず今日はここまで、続きは次回。