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