Webové služby využívajúce formát SOAP sa s pomocou WCF programujú veľmi ľahko hlavne vďaka tomu, že programátor sa môže sústrediť na biznis logiku, ktorú potrebuje implementovať. Na vytvorenie služby a rozchodenie komunikácie stačia štyri kroky:
- Zadefinovanie interface-u,
- Implementácia interface-u,
- Spustenie služby pomocou ServiceHost a povolenie generovania metadát,
- Zo schémy sa vytvorí proxy trieda pre prístup k službe.
[ServiceContract(Namespace="WebApplication1.Services")]
public interface IPublicApi
{
[OperationContract]
[WebGet]
IList<TaskGroup> GetTaskGroups();
[OperationContract]
[WebGet]
Guid CreateTaskGroup(string taskGroupName);
}
Utilitka svcutil.exe vie na základe XML schémy SOAP služby vygenerovať strongly-typed triedu pre .NET. Keď sa zmení rozhranie služby, stačí pregenerovať triedu a prípadne refektorovať kód.
S webovými službami pre Ajax to tiež nie je ťažké. WCF 3.5 podporuje
Json a stačí použiť triedu WebScriptHostFactory
ktorá vytvorí
WebServiceHost s WebScriptEnablingBehavior
. Ten pridáva podporu
pre formát Json a XML a mapuje cestu /js na generátor
JavaScript-ového proxy súbory. Vygenerovaný JavaScript je určený pre
ASP.NET AJAX framework a generátor zatiaľ nie je plug-able, čiže sa nedá
vymeniť za nejaký iný.
http://localhost/WebApplication1/PublicApi.svc/js
Objavil som však WCF REST Starter Kit (zdrojový kód je na Codeplex.com) – je to ukážka rozšíriteľnosti WCF stacku a záreveň implementácia podpory pre REST.
Tento kit obsahuje triedu HelpPageInvoker, ktorá si registruje url /help na ktorej sa zobrazí jednoduchý popis dostupných metód, ktoré HTTP príkazy (GET, POST, PUT, DELETE…) sa dajú použiť a taktiež odkazy na ukážkový request alebo response pre metódu.
http://localhost/WebApplication1/PublicApi.svc/help
REST Starter Kit je určený hlavne pre zjednodušenie práce so službou, ktorá používa POX a HTTP príkazy. Umožňuje použiť Json formát, ale cieľovou skupinou tohto kitu nie sú prímarne Ajax rozhrania.
Ak používate dependency injection
v Ajax službách, tak zrejme budete potrebovať vlastnú implementáciu
triedy HelpPageInvoker aby v nej správne fungovalo generovanie ukážkových
hodnôt pre request alebo reponse. HelpPageInvoker si zistí návratový typ
metódy, alebo jej parametre, tieto typy inštanciuje cez
Activator.CreateInstance() a objekt serializuje do XML alebo Json. Ak sú
však tieto typy definované ako rozhrania (napr. GetTaskGroups() vracia
IList<TaskGroup>) tak Activator ich samozrejme nevie ako
vytvoriť.
Tu prichádza napomoc dependency injection. Do triedy HelpPageInvoker stačí
poslať referenciu na kontajner z DI frameworku, ktorý využívate a nahradiť
štyri volania Activator.CreateInstance() za kontajner a jeho príslušné
metódy.
Nasleduje kód, ako principiálne funguje vytvorenie ukážky návratovej hodnoty pre nejakú operáciu:
class HelpPageInvoker
{
public Message GetResponseExample(OperationDescription od)
{
// z popisu operácie získa dátový typ návratovej hodnoty
// a vytvorí objekt
Type body = GetResponseBodyType(od);
object instance = UnityContainer.Resolve(body);
// vytvori Message serializovanu do Json
Message result = Message.CreateMessage(MessageVersion.None, null,
new JsonBodyWriter(instance, body));
return result;
}
}