WPF/E a externé dáta

Publikoval Michal Kočí dňa 31.3.2007 o 16:22 v kategórii Silverlight

Ako som spomínal v predchádzajúcom príspevku, alebo ako možno už viete, kód pre WPF/E sa píše v Java Scripte a je spúšťaný na strane klienta. To však znamená menší problém, ak máte dáta pre aplikáciu uložené externe, teda na serveri.

Možnosti komunikácie WPF/E aplikácie so serverom sú dosť obmedzené. Našťastie však v Java Scripte môžete použiť použiť asynchrónne HTTP volania. No a čo je lepšie použiť keď programujete .Net aplikáciu ako AJAX.Net.

Ak teda máte WPF/E aplikáciu, ktorá potrebuje komukikovať so serverom a potrebuje z neho čerpať dáta, potom môžete použiť AJAX.Net aby pre Vás vytvoril Proxy pre volanie metód ktoré ste vypublikovali ako webovú službu. Čo s Ajaxom spravíte veľmi jednoducho. Navyše, celú aplikačnú logiku píšete vo Vašom obľúbenom .Net programovacom jazyku (napríklad C#).

Uvediem aj jednoduchý príklad. Potrebujete z Vašej WPF/E aplikácie načítať zo servera informácie o nejakom objekte, napríklad o užívateľovi a napríklad o riaditeľovi Vašej organizácie. Takže na serveri máte triedu Company, ktorá má statickú metódu GetCEO, ktorá Vám vráti objekt typu User. Trieda User je definovaná nasledovne:

namespace Example
{
    public class User
    {
        public string firstName;
        public string lastName;
        public DateTime dateOfBirth;
        public DateTime dateOfStart;
        public string photoUrl;  
    }
}

Vytvoríte teda AJAX.Net webovú aplikáciu obsahujúcu službu UsersService.asmx, ktorá je implementovaná nasledovne:

[ScriptService]
[WebService(Namespace = "http://blog.michalkoci.com/wpfe-example/")]
namespace Example
{
    public class UsersService : System.Web.Services.WebService
    {
        [WebMethod]
        public Example.User GetCEO()
        {
            return Company.GetCEO();
        }
    }
}

Dôležitý je práve atribút ScriptService, ktorý znamená, že chcete aby pre túto webovú službu bola vytvorená proxy trieda v JavaScripte. A navyše musíte do Vášho webového formulára (web stránky, *.aspx) pridať tag, ktorý proxy triedu sprostredkuje:

<asp:ScriptManager ID="managerMain" runat="server">
    <Services>
        <asp:ServiceReference Path="~/UsersService.asmx" />
    </Services>
</asp:ScriptManager>

Posledné, čo musíte, respektíve chcete urobiť, je zavolať si metódu GetCEO Vašej webovej služby v klientskom Java Scripte. Vygenerovaná proxy trieda poskytuje ekvivalent Vašej metódy, pričom k parametrom každej metódy (metóda GetCEO nemá žiadne parametre) pridá ďaľšie tri a to:

  • succeededCallback - metóda, ktorá bude zavolaná, keď volanie webovej metódy skončí úspešne
  • failedCallback - metóda, ktorá bude zavolaná, keď volanie webovej metódy zlyhá
  • userContext - kontext, pod ktorým sa volanie metódy uskutoční

Pre túto jednoduchú ukážku si vystačíme s prvým parametrom. Webovú metódu z Java Script kódu môžeme zavolať tak ako v metóde CallGetCEO, kde vidíme, že ak sa volanie podarí, chceme aby bola zavolaná metóda GetCEOSucceeded. V nej máme prístup k dátam a môžeme s nimi ďalej pracovať:

function CallGetCEO()
{
    Example.UsersService.GetCEO(GetCEOSucceeded);
}

function GetCEOSucceeded(result)
{
    alert(result.firstName + " " + result.lastName);
}

Vidíme, že k výsledku môžeme pristupovať ako ku C# objektu. Je to ozaj jednoduché, až na to, že treba trochu programovať v JavaScripte, ale tomu sa pri programovaní WPF/E aplikácií bohužiaľ nevyhnete. Takže jediné čo Vás môže zachrániť je, ak budete mať v tíme človeka, ktorému programovanie v Java Scripte nevadí.

Tip na záver: Ak Vám nefunguje volanie metód, alebo ste jednoducho len zvedavý aká proxy sa Vám generuje, zavolajte si webovú službu a za jej názov pridajte /js (napríklad http//localhost/Example/UsersService.asmx/js. Vrátený súbor si otvorte v textovom editore, napríklad v Notepade alebo vo Visual Studiu. Tak uvidíte vygenerovanú proxy triedu.

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.