はじめに
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 クラスを使っています。
いざ実行!
ホストを起動して、ブラウザでアクセスします。結果は下の通りです。ロケーションバーに注目。
ちゃんと ID が 2 の製品情報を取得できていますね。
今日は眠いのでここまで。