[ WCF / C# ] Web サービスの実装とクライアントからの接続サンプル

Pocket

ここでは、Web サービスとしてホストされたクラスメソッドに対して、クライアントが ChannelFactory を使用してサービスを利用するサンプルコードを掲載しています。

スポンサーリンク

サービスのインターフェース定義

クライアントが Web サービスとして公開されている機能にアクセスするには、サービスのインターフェースを知っている必要があります。このインターフェースを DLL として作成して Web サーバおよびクライアントが共用することになります。

// System.ServiceModel の参照設定が必要
using System.ServiceModel;

namespace ChannelFactory.Sample
{
    [ServiceContract(Namespace = "http://ChannelFactory.Samples")]
    public interface IService
    {
        // アクセス回数を返す
        [OperationContract]
        int GetAccessCount();
                
        // 現在日時を変える
        [OperationContract]
        DateTime GetCurrentTime();
    }
}
Web サーバ(サービス)側の実装例

サービス側のコードになります。IService インターフェースを実装し ServiceHost クラスを使ってサービスの受付を開始しています。なお、サービスを受け付けるアドレスやポート番号は App.config に 設定します。

Windows7 で実行する場合は、サービス側アプリケーションは『管理者として実行』されていなければならなりません。

using System;
using System.Configuration;
using System.ServiceModel;

namespace ChannelFactory.Sample
{
    // サービスの実装を行うクラス
    public class TestService : IService
    {
        // 複数クライアントの場合でも累計アクセス数とするために
        // static 宣言している
        private static int _AccessCount = 0; // アクセス数

        // アクセス回数を返す
        public int GetAccessCount()
        {
            return _AccessCount;
        }
        
        // 現在日時を返す
        public DateTime GetCurrentTime()
        {
            _AccessCount++;
            return DateTime.Now;
        }

        // サービスアプリケーションメイン関数
        public static void Main()
        {
            // サービスホストの作成
            using (ServiceHost serviceHost = new ServiceHost(typeof(TestService)))
            {
                // サービスを起動
                serviceHost.Open();

                // 何かキーが押されるまで待つ
                Console.ReadLine();

                // サービスの終了
                serviceHost.Close();
            }
        }
    }
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <!-- サービスとして動作させるクラスをname属性にする -->
      <service name="ChannelFactory.Sample.TestService">
        <host>
          <baseAddresses>
            <!-- 接続先ベースアドレス -->
            <add baseAddress="http://localhost:8808/service"/>
          </baseAddresses>
        </host>

        <!-- 接続先および接続方法の設定 -->
        <!-- addressに何もいれていないのでベースアドレスと同一となる -->
        <endpoint address="" binding="wsHttpBinding" contract="ChannelFactory.Sample.IService" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
クライアントの実装例

クライアント側は、サービスの利用先情報を ChannelFactory に指定して接続します。詳細はサンプルおよびコメントを参照ください。

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;

namespace ChannelFactory.Sample
{
    class Client
    {
        static void Main()
        {
            // チャンネルの作成
            // エンドポイントはサービスのApp.configに定義されているものを指定する
            EndpointAddress address = new EndpointAddress("http://localhost:8808/service");

            WSHttpBinding binding = new WSHttpBinding();
            ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, address);
            IService channel = factory.CreateChannel();

            // サービス呼び出し
            int count = channel.GetAccessCount();
            Console.WriteLine("GetAccessCount() = {0}", count);
            // GetAccessCount() = 0
			
            DateTime dt = channel.GetCurrentTime();
            Console.WriteLine("GetCurrentTime() = {0}", dt.ToString());
            // GetCurrentTime() = 2011/05/21 16:58:32

            count = channel.GetAccessCount();
            Console.WriteLine("GetAccessCount() = {0}", count);
            // GetAccessCount() = 1
            
            // チャンネルの解放
            ((IChannel)channel).Close();
        }
    }
}
参考
スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>