WCF を利用してサービスを公開する際に、公開したサービスにアクセスする方法としてサンプルでよく紹介される「サービス参照の追加」ですが、デバッグ環境と本番環境の切り替えによりエンドポイントアドレスが異なる場合には、サービスを発行するたびにエンドポイントアドレスを書き換えるなど手間がかかり使い勝手がよくないため、通常 ChannelFactory が利用されます。
今回は、ChannelFactory を利用して WCF サービスにアクセスする方法をご紹介します。
まずは、簡単なサンプルプロジェクトを作成します。
例として『ChannelFactorySample』という名前で「コンソールアプリケーション」を作成し、続いて同じソリューション内に「WCF サービスアプリケーション」をデフォルトの名前の『WcfService1』で追加します。
今回は、WCF サービスプロジェクトに対しては何も変更を行いません。
ソリューションの構成は以下のようになります。
プロジェクトを作成しましたら、ChannelFactorySample の参照設定に「WcfService1」プロジェクトを追加します。
この時、併せてフレームワークから「System.ServiceModel」も一緒に追加しておいてください。
プロジェクトの設定ができましたので、続いてコードを書いていきます。
「ChannelFactorySample」プロジェクトの「Program.cs」を開き、Main メソッド内に処理を以下のように記載します。
using System; using System.ServiceModel; using WcfService1; namespace ChannelFactorySample { class Program { static void Main(string[] args) { try { // チャネルファクトリの作成 var channel = new ChannelFactory<IService1>( new BasicHttpBinding(), new EndpointAddress("http://localhost:53461/Service1.svc")); if (channel == null) throw new Exception("チャネルファクトリの作成に失敗。"); // チャネルの取得 var service = channel.CreateChannel(); if (service == null) throw new Exception("チャネルの作成に失敗。"); // サービスの実行 Console.WriteLine("ExecuteService=> " + service.GetData(5)); } catch (Exception ex) { Console.WriteLine(ex.Message); } // キーが押下されるまで待機する Console.ReadKey(); } } }
今回のサンプルでは、ChannelFactory の作成に BasicHttpBinding を使用しています。
また、EndpointAddress で指定しているアドレスは、「WcfService1」プロジェクトの「Service1.svc」を右クリックして「ブラウザーで表示」を選択して表示されたブラウザの、アドレスを指定します。
26行目で「IService1」で定義されている「GetData」メソッドを呼び出しています。
サービスとしてメソッドを呼び出すには、クラスに「ServiceContract」属性が付加されていること、またクラス内のメソッドに「OperationContract」属性が付加されていることが必須です。
[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); }
以上のように、サービス参照でサービスを呼び出すのと同じくらい、ChannelFactory を利用して簡単にサービスを呼び出せることがわかるかと思います。
コメントを残す
コメントを投稿するにはログインしてください。