REST スタイルなWCF


皆さんこんにちは


先週はかなり遅めの夏休みをいただいていたので、すっかり更新間隔があいてしまいました。ということで、前回は Dynamic Language のご紹介をしましたが、また今回からTechEdのDEMOのフォローシリーズに戻りたいと思います。


.NET Framework 3.5 から WCF で今までのSOAP ベースの Web サービスに加え、REST スタイルでのサービス公開もできるようになりました。 今回はその REST 対応の WCF についてご紹介したいとおもいます。


なお、この DEMO を理解するためには WCF に関する知識が必要となります。もし、WCF に関してご存じでない場合は、こちらのストリーミングでWCFの概要を学習できます。


ところで、REST とは何でしょう? 実は「これが正解」という定義はないのですが、主に下記のような要件を満たすものだと言われています。



  • URI であらゆるリソースを表現する

  • ステートレスなプロトコルを使用したサービス

  • HTTPの基本機能を使用(HTTP GET と HTTP Invokes)

SOAP を使った Web サービスのような厳密さを求めず、容易かつ柔軟に使うことができるサービスの実現方法と考えていただければ良いかと思います。


 それでは DEMO 内容の方に入っていきたいと思います。最初にサービスのインターフェースとなる Contarct の定義です。ABCのCの部分ですね。



using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web

namespace WCFRestDemo
{
   
    [ServiceContract]
    public interface ISimpleService
    {
        [OperationContract]
        [WebGet(UriTemplate="customer/{id}/")]
         Customer GetCustomer(string id);
    }

 

    [DataContract]
    public struct Customer
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string City { get; set; }
        [DataMember]
        public string Country { get; set; }

    }
}

 

注目していただきたいのが、System.ServiceModel.Web という名前空間と WebGet という属性、そしてUriTemplateです。System.ServiceModel.Web はWebスタイルのサービスを扱うために .NET Framework 3.5 から新しく導入された名前空間です。そして、WebGet という属性を用いることで、HTTP GET を用いてこのメソッドを実行することを宣言しています。 また、UriTemplate を用いて URI でパラメタを利用してメソッドに引数を渡すことを可能にしています。もちろんココで WebInvoke を使って PUT や POST を行うこともできます。


あとは、このソースを見て気づいた方もいらっしゃるかと思いますが、C#3.0 からは Parameter の記述方法が非常に簡単になっています。


 


次に、このサービスを公開するための Web.config を見てみましょう。



<?xml version="1.0"?>
<configuration>
 <system.serviceModel>
  <behaviors>
   <endpointBehaviors>
    <behavior name="simpleEndpointBehavior">
     <webHttp/>
    </behavior>
   </endpointBehaviors>
  </behaviors>
  <services>
   <service name="WCFRestDemo.SimpleService">
    <endpoint
      address="/"
      behaviorConfiguration="simpleEndpointBehavior"
      binding="webHttpBinding" 
      contract="WCFRestDemo.ISimpleService" />
   </service>
  </services>
 </system.serviceModel>
 <system.web>
  <compilation debug="true"/></system.web>
</configuration>


ここで注目していただきたいのが、endpointBehavior として<webHttp/> という要素が追加されていることと、binding が webHttpBinding となっていることろです。


 


あとは、先ほど作った ISimpleService の実装を作るだけです。ということで下記のようなコードを .svc ファイルのコード、つまり .svc.cs (C#の場合) に書いてあげるだけです。今回は SimpleService.svc というファイル名にしました。


using System;
using System.Collections.Generic;

namespace WCFRestDemo
{
    public class SimpleService : ISimpleService
    {
        private List<Customer> customers = new List<Customer>{ 
                new Customer(){Id=1,Name="Masami", Country="Japan", City="Kanagawa"},
                new Customer(){Id=2,Name="Kazuhiko", Country="Japan", City="Tokyo"},
                new Customer(){Id=3,Name="Tomoyuki",Country="Japan", City="Tokyo"},
                new Customer(){Id=4,Name="Takeshi",Country="Japan",City="Kanagawa"},
                new Customer(){Id=5,Name="Steve",Country="USA",City="Redmond"},
                new Customer(){Id=6,Name="Bill",Country="USA",City="Redmond"}
            };

        public Customer GetCustomer(string id)
        {
            foreach (Customer customer in customers)
            {
                if (customer.Id == Int32.Parse(id)) return customer;
               
            }
            throw new Exception();
        }

    }
}

今回は LINQ も使わず非常に安易な実装になっていますが、本質ではないので目をつぶってください。


この状態でビルド、実行した上でブラウザから下記の URI を叩いてみましょう。ココではSimpleService.svc に加えて UriTemplate で指定したURI 形式で 4 という引数を渡しています。



http://localhost:適切なポート番号/SimpleService.svc/customer/4/


これだけの実装で簡単に下記のような結果が返ってきます。


<Customer xmlns="http://schemas.datacontract.org/2004/07/WCFRestDemo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <City>Kanagawa</City>
  <Country>Japan</Country>
  <Id>4</Id>
  <Name>Takeshi</Name>
</Customer>

REST は URI を使って簡単にブラウザで試すことができます。いろいろと面白い発見があると思います。ぜひこれを足がかりに色々と試してみてください。


Comments (0)

Skip to main content