Další novinkou ve WCF 4 budou WebHttp Services kde budeme mít možnost komunikovat se službou pomocí NE SOAP zpráv, ale klasických xml či json requestů. Dále můžeme poslat dotaz ve formátu xml (json) a služba nám odpoví v xml (json) formátu. Vše záleží na nás jak se nám to bude líbit. Co si ovšem většina z nás vývojářů zalíbí je možnost mít plně pod kontrolou jednotlivé adresy všech metod dané služby.

Poznámka:

Jste-li vlastníkem VS 2010 ve verzi Beta, budete si muset doinstalovat přes extension managera šablonu pro vytvoření WebHtp služby (WCF Rest Service Template) a jakmile si tuto šablonu stáhnete pak budete moct vytvořit novou aplikaci typu “WCF Rest Service Application”

Šablona obsahuje předvytvořené třídy a další soubory, které si v rychlosti popíšeme:

  • Global.asax – bude nám sloužit pro nastavení routování – více později
  • SampleItem.cs – soubor, která představuje nějaké data v naší službě
  • Service1.cs – nmaše služba, která nabízí nějaké ukázkové metody
  • Web.config – standardní configurační soubor

Pro mojí ukázku si vytvoříme fiktivní databázi (třída) obsahující kategorie (CategoryCollection) a produkty (ProductCollection)

public class FakeDatabase
{
static FakeDatabase()
{
// nactu categorie a produkty
Categories = new CategoryCollection();
Products = new ProductCollection();
}

public static ProductCollection Products { get; private set; }
public static CategoryCollection Categories { get; private set; }
}

ProductCollection + Product

public class ProductCollection : Collection<Product>
{
public ProductCollection()
{
this.Add(new Product { ID = 1, Name = "Bunda", CategoryId = 1, Price = 3000 });
this.Add(new Product { ID = 2, Name = "Triko", CategoryId = 1, Price = 500 });
this.Add(new Product { ID = 3, Name = "Mikina", CategoryId = 1, Price = 200 });
this.Add(new Product { ID = 4, Name = "Kosile", CategoryId = 1, Price = 1500 });
this.Add(new Product { ID = 5, Name = "Parfem", CategoryId = 2, Price = 5000 });
this.Add(new Product { ID = 6, Name = "Hodinky", CategoryId = 2, Price = 6000 });
this.Add(new Product { ID = 7, Name = "Retizek", CategoryId = 2, Price = 200 });
}
}

public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public decimal Price { get; set; }
}

CategoryCollection + Category

public class CategoryCollection : Collection<Category>
{
public CategoryCollection()
{
this.Add(new Category { ID = 1, Name = "Obleceni" });
this.Add(new Category { ID = 2, Name = "Doplnky" });
}
}

public class Category
{
public int ID { get; set; }
public string Name { get; set; }
public ProductCollection Products { get; set; }
}

Můžeme začít implementovat naší službu. Nejdříve si přejmenujeme službu Service1.cs na EshopService. Vymažeme všechny metody uvnitř třídy a vytvoříme jednu novou metodu nazvanou Products, která vrátí seznam všech produktů v naší imaginární databázi:

[WebGet(UriTemplate = "/Products")]
public ProductCollection Products()
{
return FakeDatabase.Products;
}

Jak můžeme vidět, služba je označená atributem WebGet, pomocí kterého zpřístupníme naší službu na GET požadavky ze strany klientů a pomocí vlastnosti UriTemplate nastavíme příslušnou adresu, na které bude metoda dostupná. Kromě vlastnosti UriTemplate nabízí třída WebGet další zajímavé vlastnosti:

  • BodyStyle – pomocí tohoto atributu jsme schopni ovlivnit styl příchozí či odchozí zprávy
    • WebMessageBodyStyle.Bare – obsah všech zpráv není zabalen do speciálních elementů (ukázka níže – obrázek 1.)
    • WebMessageBodyStyle.Wrapped – obsah všech zpráv je zabalen do speciálních elementů (ukázka níže – obrázek 1.)
    • WebMessageBodyStyle.WrappedRequest – pouze obsah příchozí zprávy je zabalen do speciálního elementu
    • WebMessageBodyStyle.WappedResponse – pouze obsah odchozí zprávy je zabalen do speciálního elementu
  • RequestFormat
    • WebMessageFormat.Xml – požadavek musí přijít ve formátu XML
    • WebMessageFormat.Json – požadavek musí přijít ve formátu Json
  • ResponseFormat
    • WebMessageFormat.Xml – odpověd bude ve formátu XML
    • WebMessageFormat.Json – odpověd bude ve formátu Json

 

Obrázek 1.

Bare Wrapped
image image

Naše služba má již vytvořenou potřebnou metodu a můžeme jí vyzkoušet. Předtím budeme ovšem muset provést pár drobných nastavení. Ve vlastnostech projektu specifikujeme port (aby jsme nemuseli pokaždé měnit kód v budoucích aplikacích na číslo portu, které se vygeneruje vždy jiné) a virtuální cestu

image

Po těchto nastaveních bude naše metoda dostupná na adrese http://localhost:8090/Eshop/Products. Poslední úprava před spuštění se musí provést v souboru Global.asax v metodě RegisterRoute z důvodu, že jsme si přejmenovali třídu Service1.cs na EshopService.cs a pevně si nastavili virtuální cestu. Upravená metoda vypadá následovně:

private void RegisterRoutes()
{
// Edit the base address of Service1 by replacing the "Service1" string below
RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(EshopService)));
}

Nyní by mělo být vše připraveno ke spuštění aplikace. Jakmile stisknete F5, spustí se development server na adrese http://localhost:8090/Eshop/ a pokud k této adrese přidáme Products, uvidíme výsledný XML soubor obsahující seznam produktů.

Poznámka:

Když vytváříte WebHttp služby je defaultně povolena stránka s nápovědou, tzn. že když místo Products zadám help, dostanu se na stránku s informacemi o tom, jaké metody moje služba nabízí, jaké obsahují parametry či jak vypadá dotaz (odpověd) ve formátu xml (Json)

Závěr

V dnešním článku jste se mohly seznámit s novinkou, která Vás čeká a nemine ve verzi WCF 4. Kromě tohoto lehkého úvodu s velice jednoduchou ukázkou se v příštím díle podíváme na zajímavější věci např. jak

  • vystavit metody s parametry
  • vytvořit klienta a komunikovat se službou
  • provést update či vytvoření nového např. produktu