WCF Webサービスを作成する手順、プログラムのコードを紹介します。
概要
こちらの記事では、asmxファイルを利用したWebサービスの実装方法を紹介しました。しかし、最新のIIS、ASP.NETはより改善されたWebサービスの構築方法であるWCF(Windows Communication Foundation)が用意されています。この記事では、WCFを利用したシンプルなWebサービスの実装手順、実装コードを紹介します。
プログラム例
WCF サービス アプリケーション プロジェクトの作成
Visual Studioを起動します。
新しいプロジェクトを作成します。[新しいプロジェクトの追加]ダイアログで左側のツリービューから[WCF]のカテゴリを選択します。下図の画面が表示されますので、[WCF サービス アプリケーション]をクリックして選択します。選択後ダイアログ下部のプロジェクト名を設定します。今回は"SimpleWcfService"としました。設定後ダイアログの[OK]ボタンをクリックします。
プロジェクトが作成されます。
コード
下記のコードが生成されます。変更はしません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace SimpleWcfService
{
// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: ここにサービス操作を追加します。
}
// サービス操作に複合型を追加するには、以下のサンプルに示すようにデータ コントラクトを使用します。
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace SimpleWcfService
{
// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コード、svc、および config ファイルで同時にクラス名 "Service1" を変更できます。
// 注意: このサービスをテストするために WCF テスト クライアントを起動するには、ソリューション エクスプローラーで Service1.svc または Service1.svc.cs を選択し、デバッグを開始してください。
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null) {
throw new ArgumentNullException("composite");
}
if (composite.BoolValue) {
composite.StringValue += "Suffix";
}
return composite;
}
}
}
解説
コードは大きく分けて、インターフェイス部分とインプリメンテーション部分に分かれています。IService1 がインターフェイス部分で、Service1.svc がサービスの実装部分になっています。
用途 | | C#コード |
インターフェイス部 | IService1 | IService1.cs |
インプリメント(実装)部 | Service1.svc | Service1.svc.cs |
インターフェイス部分に記述したメソッドがWSDLなどのWebサービスとして公開されるメソッドになります。
実行結果
IService1.cs をアクティブにした状態でプロジェクトを実行します。Webブラウザが起動します。下図のディレクトリのファイル一覧画面が表示されます。。(ファイルをアクティブにする手順は
こちらの記事を参照してください)
ファイル一覧画面のService1.svc のリンクをクリックするか、Webブラウザに Service1.svc のURLを入力します。下図のページが表示されます。
ページ上部の
http://localhost:59142/Service1.svc?wsdl
リンクをクリックするとWSDLファイルにアクセスできます。
Webブラウザを閉じ、Service1.svc.cs または Service1.svc をアクティブにした状態でプロジェクトを実行します。下図の[WCFテスト クライアント]が起動し下図のウィンドウが表示されます。(ファイルをアクティブにする手順は
こちらの記事を参照してください)
左側のツリービューを展開し、[GetData]のノードをダブルクリックします。下図の画面が表示されます。
ウィンドウ中ほどの右端にある[起動]ボタンをクリックします。下図の[セキュリティ警告]のダイアログが表示されます。[OK]ボタンをクリックします。
[応答]の欄に戻り値の値が表示されます。
入力パラメーターを変化させて戻り値が戻るかを確認します。[要求]の value の[値]の欄を0から変更します。今回は "4800" としました。ウィンドウ右側の[起動]ボタンをクリックします。
[応答]の欄に戻り値の値が表示されます。 "You entered 4800" の表示になっており、入力値が反映されていることが確認できます。
Webメソッド (Web API) を実装する
動作確認ができましたので、作成した Service1 に新しくWebメソッドを実装します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace SimpleWcfService
{
// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: ここにサービス操作を追加します。
[OperationContract]
string HelloProc(string name);
}
// サービス操作に複合型を追加するには、以下のサンプルに示すようにデータ コントラクトを使用します。
[DataContract]
public class CompositeType
{
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
{
get { return boolValue; }
set { boolValue = value; }
}
[DataMember]
public string StringValue
{
get { return stringValue; }
set { stringValue = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace SimpleWcfService
{
// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コード、svc、および config ファイルで同時にクラス名 "Service1" を変更できます。
// 注意: このサービスをテストするために WCF テスト クライアントを起動するには、ソリューション エクスプローラーで Service1.svc または Service1.svc.cs を選択し、デバッグを開始してください。
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null) {
throw new ArgumentNullException("composite");
}
if (composite.BoolValue) {
composite.StringValue += "Suffix";
}
return composite;
}
public string HelloProc(string name)
{
return "こんにちは" + name + "さん";
}
}
}
解説
Webメソッドを実装するため、インターフェイス部分のIService1.csファイルにWebメソッドのタイプを実装します。[OperationContract]属性を付与します。
[OperationContract]
string HelloProc(string name);
実装部分のコードはService1.svc.cs の下記のコードになります。入力された文字列の前に「こんにちは」を追加し、文字の後に「さん」を追加しています。「〇〇」という名称が入力されると「こんにちは〇〇さん」の文字列を返す処理です。
public string HelloProc(string name)
{
return "こんにちは" + name + "さん";
}
IService1.cs は Service1.svc.cs のインターフェイスとなっているため、IService1.csに定義したメソッドは Service1.svc.cs に同名のメソッドが定義されている必要があります。今回の例では "HelloProc" の名称でメソッドを実装しているため、IService1.cs と Service1.svc.cs の両方に"HelloProc"メソッドを同じ名称で定義する必要があります。(名称が違うとインターフェイスに対する実装がない旨のコンパイルエラーとなります。)
実行結果
IService1.cs をアクティブにした状態でプロジェクトを実行します。下図の[WCFテスト クライアント]のウィンドウが表示されます。
HelloProc() のノードをダブルクリックします。下図の画面が表示されます。
[要求]エリアの "name" の値に 「灰色ペンギン」を入力します。入力後[起動]ボタンをクリックします。
[応答]エリアに戻り値の値が表示されます。値が「こんにちは灰色ペンギンさん」になっており、HelloProcが正しく動作していることが確認できます。
WCFを利用したシンプルなWebサービスを実装できました。
IIS Webサーバーへの配置
IISのWebサーバーにサービスを配置します。
事前準備
デフォルトのIISのインストールオプションでは、WCFの機能がインストールされないため、WCFの機能を先にインストールする必要があります。WCFの機能をインストールする手順は
こちらの記事を参照してください。
配置
Webサービスのプロジェクトファイルを配置します。
参考:プログラムから呼び出す場合
プログラムからWebサービスを呼び出す場合は
こちらの記事を、非同期で呼び出す場合は
こちらの記事参照してください。SOAPのインターフェイスを持っているWebサービスのため、asmxのWebサービスとおおむね同じ方法でプログラムから呼び出すことができます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2018-05-28