はじめに
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 クラスを使っています。