Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

WCFサービスライブラリのクライアントを作成する

どういうこと?

WCFサービスライブラリのクライアントを作成します。コントラクト情報はVisual Studioの「サービス参照」を利用してWCFサービスから自動的に読み取ります。

どうすれば?

プロジェクトの作成

こちらで作成したソリューションに新しいプロジェクトを追加します。
WCFサービスライブラリの作成 - プログラマーな日々
今回はWCFサービスライブラリのプロジェクトテンプレートを使用して、WCFサービスを作成します。 ...

テンプレートは[Windows フォーム アプリケーション]を選択します。

参照の追加

作成したプロジェクトに「System.ServiceModel」への参照を追加します。

サービスの起動

前回作成したHost.exeを実行してサービスを起動します。
WCFサービスライブラリのホストを作成する - プログラマーな日々
前回(以下のエントリー)作成したWCFサービスライブラリの、ホストを今回は作成します。 ...

メタデータ公開の確認
  • IEを起動し、"http://localhost:8000/WCFSampleService"と入力します。WCFサービスのメタデータが正しく公開されている場合、以下のようなテスト画面が表示されます。

サービス参照の追加
  • ソリューションエクスプローラーでプロジェクト「Client」を選択し、コンテキストメニューで「サービス参照の追加」をクリックします。すると以下のようなダイアログが表示されます。

  • すると、WCFサービスのメタデータから取得したIService1のコントラクト情報と、IService1を利用できるクライアントのクラスが自動的に生成されます。

  • app.configも自動的に作成されます。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="basicHttp" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8000/WCFSampleService/HelloWCF"
                binding="basicHttpBinding" bindingConfiguration="basicHttp"
                contract="ServiceReference1.IService1" name="basicHttp" />
        </client>
    </system.serviceModel>
</configuration>

最後の[client]要素を見ると、WCFサービスのクライアントエンドポイントに必要な「アドレス」「バインディング」「コントラクト」の3要素が既にそろっていることがわかります。

  • Host.exeを終了します。
ソースコードの作成

フォームにButtonを追加し、以下のコードを記述します。

using System;
using System.Windows.Forms;
using Client.ServiceReference1;

namespace Client {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();

            button1.Click += (s, e) => {
                Service1Client c = new Service1Client();

                try {
                    string outputMessage = c.GetMessage(".NET WCF");
                    MessageBox.Show(outputMessage);
                } catch (Exception ex) {
                    MessageBox.Show("サービス呼び出し失敗:" + ex.Message);
                }

                c.Close();
            };
        }
    }
}
マルチスタートアップの設定

以下のように設定します。

設定方法については、こちらを参照してください。
Visual Studioソリューションのマルチスタートアップが便利 - プログラマーな日々
Visual Studioでは、実行時に複数のプロジェクトを起動することができます。 ...

実行

F5キーを押します。

WCFサービスの呼び出し

button1をクリックすると、WCFサービスを呼び出します。