WCFのハローワールドプログラム。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCFHelloWorld { // インターフェースでWCFで提供するサービスを定義する // ServiceContractで、提供するサービスのメタ情報を定義する(とりあえずデフォのまま) [ServiceContract] public interface IWCFHello { // OperationContractでサービスの提供する機能を定義する [OperationContract] void Hello(string message); } // インターフェースを実装して、実際のサービスの中身を作りこむ public class WCFHello : IWCFHello { public void Hello(string message) { // とりあえずメッセージ出力する Console.WriteLine("HelloWorld Message: " + message); } } class Program { static void Main(string[] args) { // WCFのサービスを起動するためには、以下の3つが必要 // サービスのアドレス var address = new Uri("http://localhost:8888/IWCFHello"); // バインディング var binding = new BasicHttpBinding(); // コントラクト(ServiceContractのついたインターフェース) var contract = typeof(IWCFHello); // ServiceHostで、サービスをホストする。コンストラクタで、サービスの実装クラスを指定する var host = new ServiceHost(typeof(WCFHello)); // アドレス、バインディング、コントラクトを指定する host.AddServiceEndpoint( typeof(IWCFHello), binding, address); try { // 起動! host.Open(); Console.WriteLine("サービス開始"); // サービスを呼ぶにはChannelFactoryでProxyを作成する // 呼ぶ側にも、アドレス、バンディング、コントラクトの指定が必要 var ch = new ChannelFactory<IWCFHello>( binding, new EndpointAddress(address)); // proxyを作ったら、普通にサービスを呼び出せる var proxy = ch.CreateChannel(); proxy.Hello("こんにちは"); Console.WriteLine("終了時にはEnterを押してください"); Console.ReadLine(); // 終了! host.Close(); } catch { // よからぬことが起きたらAbort host.Abort(); } } } }
基本はここから始まる。
実行すると、以下のような結果になります。
サービス開始 HelloWorld Message: こんにちは 終了時にはEnterを押してください 続行するには何かキーを押してください . . .
これだけで、裏でXMLベースのメッセージがHTTPでやり取りされるようになってます。WCFHelloメッセージを以下のように書き換えると、メッセージの中身をのぞき見ることも出来ます。
// インターフェースを実装して、実際のサービスの中身を作りこむ public class WCFHello : IWCFHello { public void Hello(string message) { // とりあえずメッセージ出力する Console.WriteLine("HelloWorld Message: " + message); // 実際に送られてきたメッセージ var requestMessage = OperationContext.Current.RequestContext.RequestMessage; Console.WriteLine(requestMessage.ToString()); } }
これで実行しなおすと、以下のような結果になります。
サービス開始 HelloWorld Message: こんにちは <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8888/IWCFHello</To> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IWCFHello/Hello</Action> </s:Header> <s:Body> <Hello xmlns="http://tempuri.org/"> <message>こんにちは</message> </Hello> </s:Body> </s:Envelope>