ここでは、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();
}
}
}