Saturday, January 30, 2010 9:44 PM
lukaashek
WCF 4 – WebHttp Services – Seznámení
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 |
 |
 |
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
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