WCF で REST っぽくメソッドを呼び出す

はじめに

WCF で REST っぽい事をやってみました。

まずデータクラスを作成

[DataContract]
public class Product
{
    [DataMember]
    public string Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public decimal Price { get; set; }
}

サービスのインタフェースを作成

[ServiceContract]
public interface IProductService
{
    [OperationContract]
    [WebGet(UriTemplate = "/product/{id}/")]
    Product GetProduct(string id);
}

メソッドに WebGet 属性を追加し、UriTemplate プロパティでメソッドを呼び出すときの URI の書式を指定してます。
{id} のところに指定した値が、GetProduct メソッドに渡されます。ちなみに、string 型しか使えません。string 型でないときは例外が発生します。

サービスを作成

public class ProductService : IProductService
{
    private List<Product> _products;

    public ProductService()
    {
        _products = new List<Product>();
        _products.Add(new Product() { Id = "1", Name = "コカコーラ", Price = 120 });
        _products.Add(new Product() { Id = "2", Name = "ファンタ", Price = 120 });
        _products.Add(new Product() { Id = "3", Name = "スプライト", Price = 120 });
        _products.Add(new Product() { Id = "4", Name = "爽健美茶", Price = 120 });
        _products.Add(new Product() { Id = "5", Name = "ジョージア", Price = 120 });
    }

    public Product GetProduct(string id)
    {
        var result = from product in _products
                        where product.Id == id
                        select product;
        return (0 < result.Count()) ? result.ElementAt(0) : null;
    }
}

データはあらかじめ内部で作成。渡された ID にヒットするものを、LINQ を使って返してます。

ホストを作成

class Program
{
    static void Main(string[] args)
    {
        WebServiceHost host = new WebServiceHost(typeof(ProductService));

        host.AddServiceEndpoint(
            typeof(IProductService),
            new WebHttpBinding(),
            "http://localhost:8000/ProductService");

        host.Open();

        Console.WriteLine("Enter を押すと終了します。");
        Console.ReadLine();

        host.Close();
    }
}

コンソールアプリだけど Web サービスとして作るので、WebServiceHost クラスを使っています。

いざ実行!

ホストを起動して、ブラウザでアクセスします。結果は下の通りです。ロケーションバーに注目。
f:id:griefworker:20080905085657p:image
ちゃんと ID が 2 の製品情報を取得できていますね。

今日は眠いのでここまで。