.NET FrameworkのWCFとは?C#で簡単なサービスを作成する方法

WCFとはWindows Communication Foundationの略称で、統合通信フレームワークを表します。WCFが導入される前までは、通信フレームワークに互換性がなく、通信方式を簡単には変えることができませんでした。WCFの登場後は、複数の通信フレームワークが統合されており、共通のアプローチで複数の通信方式を扱うことが可能となりました。ここでは、このWCFについて掘り下げていきたいと思います。
- プログラマー
- WCF……統合通信フレームワークって聞いて、なんだか難しそうなイメージがあります。どうやって実装するのでしょうか?
- プロジェクト
リーダー - プログラミング初学者の方にはちょっと難しいかもしれませんね。WCFを理解するためには、基本的な概念は必ず押さえておく必要があります。まずはそこから確認していきましょう。
実行環境
・Visual Studio Community 2017
.NET Framework 3系で追加されたWCFとは
WCFは.NET Framework 3.0から新たに追加された、ネットワークを介して異なるコンピュータで動作するソフトウェア間で通信することができるフレームワークです。
WCFを理解するためには、まず知っておくべき基本的な概念が存在します。それが下記で説明する「ABC」です。
- ■A: Address
- ■B: Binding
- ■C: Contract
どこで公開するか(Where)を定義します。URLがこれに該当します
どうやって公開するのか(How)を定義します。HTTPやTCPなどの通信プロトコルがこれに該当します
何を公開するのか(What)を定義します。商取引やゲームなどがこれに該当します
このABCの基本概念があるからこそ、通信方式とロジックを分離し、通信方式の切り替えをより簡単に行うことが可能になります。
WCFでは様々な種類の通信方式が利用できますが、多くの場面で見られるのがHTTPです。利用できる通信方式も確認しておきましょう。
簡単なWCFサービスを作成する方法
今回は、C#を使って簡単なWCFサービスを作成していきましょう。
- まず、Visual Studioから新しいプロジェクトを作成します。
- プロジェクトが作成されました。プログラムは大きく分けてインターフェイス(IService1.cs)とインプリメンテーション(Service1.svc.cs)に分かれます。
以下のプログラムでは「NewProc」の箇所を新たに追加しました。それ以外は変更する必要はありません。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace WcfService1{// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コードと config ファイルの両方で同時にインターフェイス名 "IService1" を変更できます。[ServiceContract]public interface IService1{[OperationContract]string GetData(int value);[OperationContract]CompositeType GetDataUsingDataContract(CompositeType composite);// TODO: ここにサービス操作を追加します。[OperationContract]string NewProc(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; }}}}12345678910111213141516171819202122232425262728293031323334353637using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;using System.Text;namespace WcfService1{// メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コード、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 NewProc(string name){return "はじめまして" + name + "様";}}} - それでは動作確認をしてみましょう。Service1.svc.csを開いてからデバッグを実行しましょう。以下の画面が表示されます。
- クライアントのデモ環境です。今回追加した「NewProc」をダブルクリックします。
- 要求のnameの値に“テストクライアント”を設定します。起動ボタンを押下します。
- OKを押下します。
- 応答の値に正しく値が設定されていることを確認できました。
- 次に、IService1.csを開いてデバッグを実行します。以下の画面が表示されますので、Service1.svcのリンクをクリックします。
- http://localhost:54047/Service1.svc?wsdlの箇所はメモ帳などに保存しておきましょう。次項のサービスへのアクセス方法で使用します。
作成したサービスへのアクセス
- クライアントとなる新しいプロジェクトを作成します。
- プロジェクトが作成できたら、ソリューションエクスプローラーに表示されている参照を右クリックで、サービス参照の追加を行います。
追加するURLは保存しておいたhttp://localhost:54047/Service1.svc?wsdlです。
- 次に簡単なWindows Formsアプリを作成します。
テキストボックスに値を設定し、ボタンを押下するとラベルに応答値が出力される仕組みです。今回は”テストクライアント”を入力値とします。
1234567891011121314151617181920212223242526272829using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp27{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();string returnString;returnString = client.NewProc(textBox1.Text);label1.Text = returnString;}}} - ラベルに値が出力されることを確認できました。
- プログラマー
- 簡単にWCFの利用ができるのですね!まずは試しに自分でもコーディングしてみます。
- プロジェクト
リーダー - そうですね。基本的な概念を理解することはとても大切なことです。それと同時にWCFを理解する一番の近道は、自分でコーディングしてみることです。
アプリケーションの通信に利用できるWCF
統合通信フレームワークと聞いて、難しい印象を持たれた方も多いかと思います。Windows Formsでクライアント画面を実装して、通信にはHTTPプロトコルを利用するアプリケーションを開発することは、多くの場面で求められるスキルではないでしょうか。勉強の際まずは、ここで解説したような簡単なWCFの作成方法を理解することから始めることをおすすめします。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)