- 標準エンドポイント(デフォルトエンドポイント)を使用した最も単純なソリューション(ソリューション)の作成
- エンドポイントを手動で追加および構成する

オリジナルの投稿「WCFの使用の簡単な例」を書いてからかなりの時間が経ちました。 これはVisual Studio 2008より前のバージョンであり、それ以来、多くの変化がありました。 多くの人がまだその投稿のコメントで質問をしているので、サービスを上げて開始し、クライアントアプリケーションからアクセスするために今すべきことを見てみましょう。
今回はクラスライブラリのアセンブリ(クラスライブラリアセンブリ-DLL)から開始し、コンソールアプリケーション内にサービスを配置します。 クライアントは再びWindows Formsアプリケーションを使用します。 Visual Studio 2010ですべてを行っていますが、VS2008にも多くのことが当てはまります。 これが当てはまらない場合に言及し、代替手段を提供します。 今回は、私たちがすべきことをもう少し詳しく説明するので、この投稿は元の投稿よりも少し多くなります。
プロジェクト作成
最初に、サービス自体を定義する新しいクラスライブラリを作成します。 プロジェクトテンプレートとして[新しいプロジェクトとクラスライブラリ]を選択します。 プロジェクト名「EmailService」とソリューション名「WCFSimpleExample2010」を指定します。 ソリューションの名前を設定できない場合は、[ソリューションのディレクトリを作成する ]オプションが選択されているかどうかを確認してください。

契約作成
まず、WCFで呼び出される1つのメソッドまたは操作のみでコントラクトを作成します。 ファイルの名前をIEmailValidator.csに変更し、同じ名前のインターフェイスを作成します。
次に、ValidateAddressメソッドの署名を追加します。このメソッドは、string型のEmailAddress引数を1つ受け取り、ブール値を返します。 これは通常のインターフェイスであり、複雑なものはありません。
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
public interface IEmailValidator { bool ValidateAddress( string emailAddress); } * This source code was highlighted with Source Code Highlighter .
次に、これが契約であることをWCFに通知する必要があります。 これを行うには属性を追加しますが、最初にSystem.ServiceModelへの参照を追加する必要があります。 プロジェクトを右クリックして[ 参照の追加 ]を選択し、リストから[System.ServiceModel]を選択します。 私はVisual Studio 2010 Pro Power Toolsを使用しているため、スクリーンショットの画像は実際のものとは異なる場合がありますが、考え方は同じです。


これで、インターフェイスに属性を追加できます。 ServiceContract属性をインターフェイス定義の上に配置し、OperationContract属性を操作の上に配置します。 コードファイルの最初にusing System.ServiceModelディレクティブを追加するか、属性名の1つにカーソルを合わせたときにVisual Studioに実行させます。 正しく入力し、大文字と小文字を区別する場合は、CTRL +を押します。 コンテキストメニューが表示され、usingディレクティブを自動的に追加できます。 その結果、インターフェースは次のようになります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- [ServiceContract]
- パブリック インターフェイス IEmailValidator
- {
- [OperationContract]
- bool ValidateAddress( string emailAddress);
- }
サービス実装の作成
コントラクトを作成したので、実際にやりたいことをするために、サービスのコードを書く必要があります。 インターフェイスを実装する新しいクラスを作成します。 正規表現を使用してメールアドレスを確認し、正しい場合はtrueを返します。 次のコードのように入力するか、独自のコードを作成する必要があります。 :-)
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック クラス EmailValidator:IEmailValidator
- {
- public bool ValidateAddress( string emailAddress)
- {
- Console .WriteLine( "検証:{0}" 、emailAddress);
- string pattern = @ "^([0-9a-zA-Z]([-。\ w] * [0-9a-zA-Z])* @(([[0-9a-zA-Z])+( [-\ w] * [0-9a-zA-Z])* \。)+ [a-zA-Z] {2,9})$ " ;
- return Regex.IsMatch(emailAddress、pattern);
- }
- }
これで、サービスに最も重要な2つのクラスができました。 実際、インターフェイスを使用する必要はありませんが、ベストプラクティスです。 したがって、複数のインターフェースを継承し、異なるバージョンのインターフェースを実装できます。
ホスト作成
すでに述べたように、コンソールアプリケーションをホストとして使用します。 新しいプロジェクトを追加し、プロジェクトテンプレートとしてコンソールアプリケーションを選択します。 「ConsoleHost」という名前を付けます。

System.ServiceModelへのリンクと、 EmailServiceプロジェクトへのリンクを再度追加します 。 以下のように、MainメソッドでServiceHostオブジェクトを作成し、コンストラクターで正しい引数を渡します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- タイプserviceType = typeof (EmailValidator);
- Uri serviceUri = new Uri ( "http:// localhost:8080 /" );
- ServiceHost host = new ServiceHost(serviceType、serviceUri);
- host.Open();
4行目では、ServiceHostオブジェクトを作成します。 最初の引数として、彼はサービスの実装のタイプを受け取ります。 そして、2番目の引数としてのベースアドレス。 ベースアドレスの 詳細についてはこちらを、場所の詳細についてはこちらをご覧ください 。 タイプは1行目で定義され、ベースアドレスは2行目です。最後に、5行目でホストが起動します。
WCF4:標準エンドポイント
これは、すでに.NET Framework 4.0の機能であり、以前のバージョンの.NETに実装することは不可能です。 標準のエンドポイントは、サービスの構成を面倒なものにすることを目的とした新しい機能です。 誰もが何が起こっているのかがわかるように、すべてを詳細に明示的に定義したいと思います。 しかし、この例では、すべてが非常にうまく機能します。 使用しない場合。 NET 4.0では、後で公開される2番目のパートを読んだり移動したりすることはできません。
host.AddDefaultEndpoints();を追加することにより、自分で標準エンドポイントを追加できます。 コードの文字列host.Open();の直前。
エンドポイントがデフォルトで構成されていることをどのように確認できますか? 現在実行中のすべてを表示する遠い過去の小さなスクリプトがあります。 詳細には触れず、host.Open();の後に次のコード行を挿入します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- #regionリスニングを出力するディスパッチャ
- foreach (host.BaseAddressesのUri uri)
- {
- Console .WriteLine( "\ t {0}" 、uri.ToString());
- }
- Console .WriteLine();
- Console .WriteLine( "リスニングしているディスパッチャの数:{0}" 、host.ChannelDispatchers.Count);
- foreach (host.ChannelDispatchersのSystem.ServiceModel.Dispatcher.ChannelDispatcherディスパッチャー)
- {
- Console .WriteLine( "\ t {0}、{1}" 、dispatcher.Listener。Uri .ToString()、dispatcher.BindingName);
- }
- Console .WriteLine();
- Console .WriteLine( "<ENTER>を押してホストを終了します" );
- Console .ReadLine();
- #endregion
これで、以下の最初のスクリーンショットのように、エンドポイントを見ることができます。 ブラウザーを使用してサービスURIに移動し、標準のMEXエンドポイントを確認できます 。


ご覧のとおり、これはエンドポイントMEX(別名メタデータ)がまだ構成されていないことを示しています。 これで、新しい標準エンドポイントを介してこれを行う簡単な方法があります。 私の第一印象は、それが機能するということでした。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- タイプserviceType = typeof (EmailValidator);
- Uri serviceUri = new Uri ( "http:// localhost:8080 /" );
- ServiceHost host = new ServiceHost(serviceType、serviceUri);
- host.AddDefaultEndpoints();
- //これは実際には単に機能するだけではありません。
- host.AddServiceEndpoint( new ServiceMetadataEndpoint());
5行目には標準のエンドポイントが追加され、7行目にはServiceMetadataEndpointまたはMEXエンドポイントが追加されていることがわかります。 残念ながら、メタデータの動作を単独で追加することはできませんので、自分で追加する必要があります。 別の方法は、メタデータを含める構成を指定することです。 WCF4のもう1つの新機能は、構成を継承する機能です。 machine.configまたはローカル構成で、WCFサービスの既定で有効にするものを指定できます。 machine.configでこれを行わないことをお勧めしますが、これは単なる意見です。 これをプロジェクト構成、つまりコンソールホストアプリケーションのapp.configファイルに実装する方法を次に示します。 次のパートでは、昔ながらの方法で、Visual Studio 2008で機能する方法で、私自身が好む方法で行うことに注意してください。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- <? xml バージョン = "1.0" encoding = "utf-8" ? >
- < 設定 >
- < system.serviceModel >
- < 動作 >
- < serviceBehaviors >
- < 動作 >
- < serviceMetadata httpGetEnabled = "True" />
- </ 動作 >
- </ serviceBehaviors >
- </ 動作 >
- </ system.serviceModel >
- </ 設定 >
ご覧のとおり、動作の名前を指定しませんでした。WCF4では、すべてのサービスで使用されることを意味します。 また、各サービスにはHTTPエンドポイントのベースアドレスが必要であることも意味します。
参考までに、コンソールホストアプリケーションのコードは次のとおりです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- static void Main( string [] args)
- {
- タイプserviceType = typeof (EmailValidator);
- Uri serviceUri = new Uri ( "http:// localhost:8080 /" );
- ServiceHost host = new ServiceHost(serviceType、serviceUri);
- host.Open();
- #regionリスニングを出力するディスパッチャ
- foreach (host.BaseAddressesのUri uri)
- {
- Console .WriteLine( "\ t {0}" 、uri.ToString());
- }
- Console .WriteLine();
- Console .WriteLine( "リスニングしているディスパッチャの数:{0}" 、host.ChannelDispatchers.Count);
- foreach (host.ChannelDispatchersのSystem.ServiceModel.Dispatcher.ChannelDispatcherディスパッチャー)
- {
- Console .WriteLine( "\ t {0}、{1}" 、dispatcher.Listener。Uri .ToString()、dispatcher.BindingName);
- }
- Console .WriteLine();
- Console .WriteLine( "<ENTER>を押してホストを終了します" );
- Console .ReadLine();
- #endregion
- }
メタデータにアクセスする
これで、Internet Explorerまたはその他のブラウザーを開き、コンソールホストアプリケーションを起動し(そうでない場合、エンドポイントは利用できません)、サービスのURIに移動できます: http:// localhost:8080 /
WSDLへのリンクを含む画面が表示された場合は、おそらくサービスの作成を処理したことになります。
クライアントアプリケーションの作成
次に、サービスにアクセスする別のプロジェクトを追加し、指定された電子メールアドレスが有効かどうか、または少なくとも正規表現を満たしているかどうかを確認する機会があります。
新しいコンソールアプリケーションを追加し、今回はConsoleClientと呼びます。 サービス(ホスト)が実行されており、デバッグモードで動作していないことを確認してください。 最も簡単な方法は、ConsoleHostプロジェクトを開始プロジェクトとして設定し、CTRL + F5を押して非デバッグモードで開始することです。
ここで、クライアントとサービスの間にあるプロキシクラス(プロキシクラス)が必要です。 サービスのプロキシを作成するには2つの方法があります。 何が起こっているのかを正確に知るために、手動でこれを行うことを好みます。 最初に表示します。
手動プロキシ作成
開始するには、Visual Studio 2010(またはVisual Studio 2008)コマンドプロンプトを実行し、 ConsoleClientの場所に移動します。 これはVisual Studioのコマンドラインであるため、svcutil.exeプロキシジェネレーターにアクセスする必要があります。 次のコマンドを入力します。
svcutil http://(___)localhost:8080/ /o:ServiceProxy.cs /config:App.Config /n:*,ConsoleClient
このコマンドは、サービスプロキシとアプリケーション構成ファイルの2つのファイルを生成する必要があります。 ConsoleClientアプリケーションを使用してVisual Studioに戻ります。 App.ConfigおよびServiceProxy.csを使用可能にするには、次のスクリーンショットに示すように、 ソリューションエクスプローラーの上部にあるアイコンをクリックする必要があります。 これで、新しいファイルが表示され、プロジェクトに含めることができます。
注:コンソールウィンドウのスクリーンショットには、ConsoleClientではなく、誤ったConsoleHost名前空間が表示されます。


svcutil.exeを起動したときに、ホストで示されているように、最初の引数としてサービスの場所を渡しました。 これはベースアドレスです。 2番目の引数はプロキシです。 3番目の引数は、アプリケーション構成も更新し、使用できない場合は作成することを示します。 最後の引数はプロキシの名前空間で、現在はアプリケーションと同じです。
サービスコール
これでようやくサービスを利用できます。 ProgramクラスのMainメソッドに再び渡します。 これで、接尾辞Clientが付いたサービスの名前を持つプロキシクラスにアクセスできます。 この場合、 EmailValidatorClient 。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- EmailValidatorClient svc = new EmailValidatorClient();
- bool result = svc.ValidateAddress( "dennis@bloggingabout.net" );
1行目で、プロキシの初期化を確認できます。 これは接続の確立を意味するものではなく、最初の呼び出しで発生します。 2行目では、サービスが呼び出され、結果が返されます。
以下は、電子メールアドレスを要求するMainメソッドのコードです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- static void Main( string [] args)
- {
- while ( true )
- {
- Console .WriteLine( "メールアドレスを入力するか、[ENTER]を押して終了します..." );
- string emailAddress = Console .ReadLine();
- if ( string .IsNullOrEmpty(emailAddress))
- 帰る
- EmailValidatorClient svc = new EmailValidatorClient();
- bool result = svc.ValidateAddress(emailAddress);
- Console .WriteLine( "メールアドレスは有効です:{0}" 、結果);
- }
- }
Visual Studioを介してプロキシを作成するのは簡単な方法です。
svcutil.exeを使用してサービスプロキシを手動で作成する代わりに、Visual Studioにサービスプロキシを作成させることもできます。 プロジェクトを右クリックして[サービス参照の追加...]を選択するだけで、サービスと名前空間のアドレスを入力する必要があるダイアログボックスが表示されます。

これでConsoleClient名前空間になりましたが、既存の名前空間を結合します。 そのため、 ConsoleClient.EmailValidatorClientを介してEmailValidatorClientにアクセスできます。 これが、自動生成されたプロキシクラスを使用したくない理由の1つです。 ここで、この名前空間にusingディレクティブを追加することを忘れないでください。 おそらく、最良の解決策は、ダイアログボックスでプロキシ名前空間または類似のものを指定して、完全な名前空間名がより意味のあるものにすることです。
クライアントの起動
サービスがまだ実行されている場合(実行されていない場合は再起動します)、ConsoleClientプロジェクトを右クリックして[新しいインスタンスの デバッグと開始]を選択できます 。 すべて完了しました。
次は?
次に、エンドポイントを手動で追加する方法とIISでサービスをホストする方法について説明します。 あなたはここでそれについて読むことができます 。
ここから、Visual Studio 2010のソリューションをダウンロードできます 。 Visual Studio 2008のソリューションは、次のパートでも利用できます。