1. 基本的な方法


1.1. ホスト

以下の<0> ~ <4>の処理を記述する。

using System.ServiceModel;

namespace HelloWCF
{
  // <0> ServiceContractをインターフェースとして定義
  [SercieContract(namespace = "http://My.WCF.Samples")]
  public interface IService1
  {
    [OperationContract]
    string getMessage(string inputMessage);
  }
 
  public class Service1 : IService1
  {
    public string getMessage(string inputMessage)
    {
      ...
    }
  }
 
  static void Main(string[] args)
  {
    Uri baseAddr = new Uri("http://host:port/ServcieName");
  
    // <1> ベースアドレスからServiceHostを生成
    using (ServiceHost svcHost = new ServiceHost(typeof(Service1), baseAddr))
    {
      // <2> ServiceHostインスタンスにエンドポイントを追加
      svcHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "test");

      // <3> ServiceHostオープン
      svcHost.Open();

      ...

      // <4> ServiceHostクローズ
      svcHost.Close();
    }
  }
}

1.2. クライアント

以下の<0> ~ <3>の処理を記述する。

using System.ServiceModel

// <0> サービスコントラクト(インターフェース)の宣言
サービスコントラクト宣言は省略。

method()
{
  // <1> エンドポイントアドレス(サービスの絶対アドレス:System.ServiceModel.EndpointAddress)を生成
  EndpointAddress epAddr = new EndpointAddress ("http://host:port/ServcieName/test");
 
  // <2> ChannelFactoryからプロキシを生成
  IService1 proxy = ChannelFactory<IService1>.CreateChannel(new BasicHttpBinding(), epAddr);
  try
  {
    // <3> プロキシ経由でメソッドを実行
    var return = proxy.getMessage("abc");
    ...
  }
  catch (CommunicationException ex)
  {
    ...
  }
}

2. [WCFサービス ライブラリ]テンプレートを利用する方法

2.1. 概要

以下の構成でソリューションを作成。
  • VsSolution
    • Libraryプロジェクト (output:dll)
      "WCFサービス ライブラリ"テンプレートの利用
      • IService1.cs : ServiceContract宣言(名前空間:HelloWCF2)
      • Service1.cs : ServiceContract実装
    • Hostプロジェクト (output:exe)
      Libraryプロジェクトを"参照の追加"
      • App.config (アプリケーション構成ファイル)
      • Program.cs
    • Clientプロジェクト (output:exe)
      Hostプロジェクトの"サービス参照の追加"
      • Service References\ServiceReferene1\Reference.cs(自動生成されたサービス参照)
      • App.config(自動生成されたアプリケーション構成ファイル)
      • Form1.cs(Windowsアプリケーションテンプレートによる生成)

2.2. Hostプロジェクト

Libraryプロジェクトの参照を追加し以下の作業を行う。
  • "参照の追加"を設定
  • App.configの編集
    • WCFサービスのコントラクト情報開示設定
    • WCFサービス公開設定
  • ホスト(Program.Main)の実装

2.2.1. App.configの編集

以下の(0) ~ (1)の処理を記述する。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
 
    <!--
        (0) [[WCF]]サービスのコントラクト情報公開の為のサービスのビヘイビア変更
            既定のビヘイビアではメタデータは公開されない為、[[HTTP]]のGET要求で
            サービスのメタデータの取得が可能となる。
    --> 
    <behaviors>
      <behavior name="svcBehavior">
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </behaviors>
    <!-- (0) -->
 
    <!--
        (1) WCFサービスの定義。このサービスでは(0)で定義されたビヘイビアが
            適用され、そのメタデータを公開する。またエンドポイント要素と
            ホスト要素を定義。

            エンドポイント要素"endpoint"として以下の情報を設定する。
            1. コントラクト
            2. バインディング
            3. 相対アドレス

     ホスト要素"host"ではベースアドレスを設定する。
    --> 
    <services>
      <service behaviorConfiguration="svcBehavior" name="HelloWCF2.Service1">
        <endpoint address="HelloWCF" binding="basicHttpBinding"
                   name="basicHttp" contract="HelloWCF2.IService1" />
        <host>
          <baseAddress>
            <add baseAddress="http://localhost:8000/WCFSampleService" />
          </baseAddress>
        </host>
      </service>
    </services>
    <!-- (1) -->
  
  </system.serviceModel>
</configuration>

2.2.2. ホスト(Program.Main)の実装

App.configにてベースアドレス定義やエンドポイント追加を記述した為、プログラムでハードコーディングは不要となる。

using System.ServiceModel;

namespace Host
{
  class Program
  {
    static void Main(string[] args)
    {
      using (ServiceHost svcHost = new ServiceHost(typeof(HelloWCF2.Service1)))
      {
        svcHost.Open();
        ...
        svcHost.Close();
      }
    }
  }
}

2.3. Clientプロジェクト

以下の作業を行う。

2.3.1. WCFサービスのメタデータ公開確認

Hostプロジェクトのexeを実行し以下のURLに正しくアクセスできることを確認する。

2.3.2. "サービス参照の追加"を設定

"参照設定"から"サービス参照の追加"を実行する。"サービス参照の追加"ダイアログのアドレスは"検索"ボタンで入力するか、直接ベースアドレスを入力する。
この操作により以下のオブジェクトが自動生成される。
  • "Service References"以下の"ServiceReference1"名前空間
    • IService1が利用できるクライアント"Service1Client"
  • App.config
    • Webサービスのエンドポイント要素

2.3.3. クライアント(From1)の実装

以下の<0> ~ <3>の処理を記述する。

// <0> "サービス参照の追加"で生成された名前空間も引用する。
using System.ServiceModel;
using Client.ServiceReference1;

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

    private void button1_Click(object sender, EventArgs e)
    {
      // <1> クライアント生成
      Service1Client client = new Service1Client();

      // <2> WCFサービス呼び出し
      try
      {
        string outputMessage = client.getMessage(".NET WCF");
        ...
      }
      catch (CommunicationException commEx)
      {
        MessageBox.Show("サービス呼び出し失敗:" + commEx.Message);
      }

      // <3> クライアントクローズ
      client.Close();
    }
  }
}

3. RESTfulサービス(GET)の実装

3.1. 概要

以下の構成でソリューションを作成。
  1. [WCFサービスアプリケーション]テンプレートでプロジェクトを作成する。
  2. データコントラクトを定義する。(インターフェース)
  3. 属性を定義した具象化クラスを実装する。
  4. *.svcファイルのServiceHostタグ属性FactoryでWebServiceHostFactoryを指定する。


IOrderService.cs
using System.ServiceModel;

namespace WCFServiceWebRole1
{
    [ServiceContract]
    public interface IOrderService
    {
        [OperationContract]
        OrderItem GetOne(string id);
    }

    [DataContract(Namespace = "", Name = "OrderItem")]
    public class OrderItem
    {
        [DataMember]
        public int Id;

        [DataMember]
        public string Name;
    }
}

OrderService.svc.cs
using System.ServiceModel.Web;

namespace WCFServiceWebRole1
{
    public class OrderService : IOrderService
    {
        // WebMessageFormat.Xml : POX(プレーンなXML形式)
        [WebGet(UriTemplate = "orders/{id}", ResponseFormat = WebMessageFormat.Xml)]
        public OrderItem GetOne(string id)
        {
            return new OrderItem
            {
                Id = int.Parse(id),
                Name = "テスト"
            };
        }
    }
}

OrderService.svc
<%@ ServiceHost Language="C#" Debug="true"
   Service="WCFServiceWebRole1.OrderService"
   CodeBehind="OrderService.svc.cs"
   Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>


4. RESTfulサービス(GET, POST)の実装




タグ:

+ タグ編集
  • タグ:
最終更新:2011年07月04日 16:57