Skip to main content

Posts

Showing posts with the label Silverlight

How to force browser to updated the Silverlight package from client?

Where developing an application in Silverlight you will need to create more than one version of the application. Each new version of the application will require each client to clear the cache (CTRL+F5). Normally, you don’t want the application to be downloaded each time.  Because of this, you will not configure the package to expire after a specific period of time. But what happens when you have a new version of the application? You cannot tell to the clients to clear the cache. A simple solution for this problem is to version your assemblies. When you deploy on IIS server a new version of the application with the assembly version updated, the new version of your application will be automatically download from the server. If you don’t know how to version your assemblies you can visit the following link: http://vunvulearadu.blogspot.ro/2012/05/how-to-change-version-of-our-solution.html Don’t forget to update the assembly version each time when you make a deploy.

The provided URI scheme 'file' is invalid; expected 'http'

Zilele acestea lucram pe un proiect Silverlight si m-am trezit intr-un anumit moment ne-am trezit cu urmatoarea eroare: The provided URI scheme 'file' is invalid; expected 'http' in momentul in care se genera URL serviciului consumat de catre aplicatie Silverlight. ChannelFactory nu stia ce sa faca cu un path non HTTP care nu era de forma HTTP, in conditiile in care acesta era configurat sa lucreze pe HTTP. Dupa ce am sapat putin, am observat ca adresa care se adresa care se genera avea urmatoarea forma "/MyService/service1.svc", iar in momentul cand se incerca generarea unui endpoint se obtinea o adresa de forma "file://C:[somePath]/MyService/service1.svc". var endpointAddress = new EndpointAddress("/MyService/service1.svc"); Problema aparea de la modul in care era rulata solutie. In loc sa se ruleze proiectul web, care continea solutie Silverlight, se rula de fapt proiect Silverlight, acesta ruland din locatia file://.... Odata sch...

One way to persist objects in isolated storage

In unele cazuri avem nevoie sa stocam date in isolated storage. In cazul in care numarul de date pe vrem sa le stocam nu este foarte mare, putem sa le serializam direct si sa le salvam sub forma unui fisier in isolated storage. In exemplul de mai jos, datele le-am serializat folosind DataContractSerializer . Din aceasta cauta, clasele pe care vrem sa le salvam trebuie sa fie decorate cu atributul DataContract , iar fiecare proprietate pe care dorim sa o salvam trebuie decorata cu atributul DataMember . [DataContract] class Foo { [DataMember] public string Name { get; set; } public int Age {get; set; } } In exemplul dat mai sus o sa salvam doar proprietatea Name. Mai jos puteti sa gasiti o clasa generica care salveaza un obiect dat. In metodele Save si Load as fi putut sa trimit ca si parametru numele la fisier, dar am ales ca numele de fisier sa se genereze pe baza tipului. Se poate si in alte moduri. public class IsolatedStorageRepository<TItem> { public ...

One way to use Dispatcher in a Silverlight application

Daca suntem intr-o aplicatie MVVM folosind Siverlight, in unele situatii o sa avem nevoie Dispatcher pentru a executa cod pe UI thread. O varianta este de a trasmite o instanta la Dispatcher prin constructor sau cand se face apelul la o metoda data. public class Context() { ... Context(Dispatcher dispatcher) { _dispatcher = dispatcher; } .. { _dispatcher.BeginInvoke( () => { ... } ); } } O alta varianta destul de des intalnita este sa se obtina o referinta la Distapcher direct prin apelul: Deployment.Current.Dispatcher Ambele variante functioneaza fara nici o problema. Problema este ca clasele care folosesc acest Dispatcher o sa fie coupled. Aceasta problema se poate observa cel mai usor in momentul in care se scriu teste. Daca testele o sa reluze din brower de exemplu, pana la sfarsitul testelor, threadul de UI o sa fie blocat de rularea acestora, din aceasta cauza nu o sa se ajunga ca codul apelat prin Dispatcher sa fie executat. Pe langa acest lucru in teste dorim sa...

WCF and Silverlight - How to add custom information to a message header

In acest post am discutat despre cum se pot pune informatii in header-ul unui mesaj care este trimis prin WCF. In cazul in care incercati sa folositi aceasta solutie pentru un client pe Silverlight, o sa observati ca desi serverul adauga proprietatiile in header-ul mesajului acestea nu ajung la client, chiar daca pe sarma sunt adaugate. Din Silverlight nu avem acces la toate proprietatiile care sunt trimise in header. Avem acces doar la cateva proprietati. De exemplu una din propietati este StatusCode. Acesta are valoarea 200 daca apelul s-a terminat cu success. Datele care le punem in header pentru un client Siverlight, trebuie sa fie puse ca un nou Header. Mai jos gasiti cum puteti adauga un nou header de pe server, iar clientul cum il poate accesa. Al doilea parametru pe care l-am setat cu empty string reprezinta namespace URI pentru header-ul nostru. public class ServerTokenInspector : IDispatchMessageInspector { public void BeforeSendReply(ref Message reply, object corr...

WCF - How to add custom information to a message header

De obicei intr-o aplicatie client-server folosim WCF pentru a putea comunica intre client si server. WCF este un framework destul de complex si desi este usor de integrat intr-o aplicatie, cand dorim sa facem ceva mai complex putem sa ne trezim pierduti intre tot felul de documentatii si carti despre WCF. In acest post o sa prezint cum putem adauga in header-ul mesajului care se trimite la client un continut custom( date suplimentare). O sa pornim de la urmatarea cerinta: fiecare mesaj care vine de la server trebuie sa vina insotit de un token unic a serverului. O solutie la aceasta problema ar putea fi ca fiecare mesaj( contract) pe care il primim de la server sa fie incapsulat intr-o clasa de tip Response care contina tokenul nostru. Aceasta solutie este destul de buna, dar ce ne facem daca avem nevoie sa adaugam alte date pe langa token? O sa fie nevoie sa facem update imediat la clienti, servicile pe care le expunem prin WCF trebuie versionate si alte probleme de acest gen. Plus ca...

Debug Silverlight application - breakpoint not hit

In cazul in care lucrati cu o aplicatie Silverlight si vreti sa faceti debug s-ar putea sa va treziti nici un brake point nu este atins. Cele mai comune cauze la aceasta probleme sunt: proiectul web care contine XAP nu este setat sa permita debug si la Silverlight. Acest lucru se poate activa in felul urmator: click dreapta pe proiectul web care contine xap-ul. Sub tabul Web in zona de Debuggers, verificati sa fie selectat si Silverlight puteti incerca tot din Properties de pe proiectul web din tab-ul Silverlight Applications sa stergeti link-ul spre proiectul Silverlight si sa il adaugati din nou( in cazul in care nu aveti proiectul adaugat ca si link, checkboxul de la punctul precedent nu o sa fie vizibil verificati ca in browser rulati un url care contine http// si nu file//. Debugul spre linkuri spre local file system este dezactivat nu sunteti atasati la procesul care trebuie( aceasta este o problema a Visual Studio care nu se ataseaza la procesul care trebuie). Pentru a va atasa ...

Silverlight - Diferente intre MAC OS si Windows OS.

Am fost întrebat zilele astea de doua persoane de limitările pe care le are Silverlight pe MAC OS. O sa încerc sa enumăr cîteva din aceste limitări mai jos. 1. Din cauza ca pe MAC unele tipuri de data nu exista sau sunt reprezentate diferit, este posibil ca metoda ToString() sa returneze valori diferite pe cele doua sisteme. Mai interesant este cand apelam ToString() pentru Single.PositiveInfinity.ToString() In cazul MAC-ului o sa obtinem "+oo", iar pe Windows o sa avem "Infinity". 2. Cand lucram cu informatii despre cultura (CultureInfo) rezultatele o sa difere intre cele doua sisteme chiar daca avem aceiasi cultura setata. Totodata TextInfo.ListSeparator pe MAC OS va returna mereu caracterul ',' indiferent de cultura pe care o avem setata. 3. Daca folosim metoda SaveFileDialog, aceasta nu o sa afiseze la user nici o eroare cand userul foloseste caractere invalide, dar in schimb se va arunca exceptia System.ArgumentException pe care noi trebuie sa ...

(3) How to use Office in Silverlight applications

Lista postări despre Office interop pe Silverlight: Part 1 Part 2 Part 3 Si iată ca am ajuns la ultimul post din seria de 3 posturi despre Office Interop pe Silverlight. Am rămas dator cu doua topice: cum sa închidem un proces office; cum sa scriem unit teste; Pentru a putea închide procesul pe care îl avem pornit ajunge sa apelam direct metoda Quit(). Atenție, când se apelează aceasta metoda orice modificare deja făcuta nu o sa fie salvata. Pentru a putea face și save trebuie sa apelam și metoda metoda de salvare: excelApp.Save(); excelApp.Quit(); In cazul în care dorim sa închidem doar un document separat putem sa apelam la metoda Close , care poate sa fie accesibila pentru fiecare document separat. Testarea automata a unei aplicații care lucrează direct cu interop-ul de Office este destul de dificila. De exemplu cum putem sa testam dacă un document a fost deschis și este vizibil user-ului? Trebuie sa verificam ca avem în Windows o fereastra deschisa (lista de procese pornite în Win...

(2) How to use Office in Silverlight applications

Lista postări despre Office interop pe Silverlight: Part 1 Part 2 Part 3 In postul precedent am povestim despre problemele pe care le putem avea când încercam sa folosim API de Office pe Silverlight. Astăzi o sa discutam despre modul în care care trebuie configurat proiectul pentru a putea sa folosim API de Office și cum putem sa executam câteva funcții de baza. Pentru a putea apela API de Office pe Silverlight este nevoie sa setam aplicația sa ruleze Out of the brower (OOB) și sa cu permisiuni elevate. Aceste setări trebuie setate pe proiectul de Silverlight care conține App.xml. Click dreapta pe proiect în tab-ul Silverlight checkbox-ul "Enable running application out of the brower" sa fie check-uit iar în setările pentru out of the brower aveti grija sa check-uit și "Require Elevated trust when running outside the browser". Pentru a putea sa accesam API de Office (COM-uri in general) din Silverlight o sa fim nevoiți sa lucram cu obiecte de tip dynamic. Crearea ...

(1) How to use Office in Silverlight applications.

Lista postări despre Office interop pe Silverlight: Part 1 Part 2 Part 3 Acesta este primul post dintr-o serie de trei sau patru posturi în care o sa discutam despre Silverlight și interop (Office interop). Dupa cum știm Silverlight suporta integrarea cu Office prin intermediul la interop, dar înainte sa ne aruncam cu capul în fata în API si sa vedem ce putem face o sa prezint ce nu putem face din Silverlight. Nu avem acces la API-ul de Office in totalitate. Chiar daca in teorie folosim COM-urile de Office nu o sa putem apela orice metoda. De exemplu din cauza modului in care o aplicație Silverlight ruleaza pe o masina, nu o sa putem face pe client new la un nou document. Dar acest lucru este cauzat direct de Silverlight, care nu ne permite sa generam fisiere pe client (in modul in care Office-ul are nevoie). O solutie la aceasta problema este crearea fisierului pe server, iar apoi sa il copiem pe client. Putem sa avem templaturi care sa le copiem pe client si prin duplicarea lor sa r...

Assembly comun intre mai multe tipuri de proiecte in Visual Studio

Uneori lucram cu proiecte care au assembly-uri atat pe Silverlight cat si solutii clasice .NET. Din pacate un assembly de Silverlight nu se fi adaugat ca si referinta la un proiect normal( sau invers). O solutie la aceasta problema este sa adaugam fisierele ca si "Add as link" intr-unul din cele doua proiecte. Dar problema apare la compilare, in cazul in care apelam API care nu este suportat de una din platforme si uitam sa compilam fiecare solutie in parte pentru a face aceasta verificare. Din aceasta cauza ne putem trezii cu neplaceri. Ar fi frumos sa avem la dispozitie un proiect comun, pe care sa il putem referentia in orice proiect. Aici vine in ajutor Microsoft si ne pune la dispozitie Portable Library Tools . Din pacate acest lucru trebuia facut in momentul in care au lansat Visual Studio 2010, dar niciodata nu este prea tarziu. Cu ce ne ajuta acest tool? Avem posibilitatea sa avem un assembly comun intre Silverlight, XNA, Windows Phone, XBox si proiecte .NET clasice....

Cum sa facem handling la evenimente dontr-o pagina HTML afisare printr-un controler Silverlight

Pentru a putea face acest lucru avem nevoie de un mecanism prin care sa trasmitem evenimentul produs. O solutie este javascript. In Silverlight avem doua controlare care se ocupa cu acest lucru WebBrower si HtmlBrush. Din pacare doar WebBrower stie sa faca handling la evenimente de java script. Prin intermediul acestora codul C# poate sa apele metode javascrip din interiorul paginii pe care o afisam sau sa se inregistreze la anumite evenimente(metode). Pentru a putea face acest lucru este nevoie sa adaugam in fisierul xaml controlerul care ne permite sa afisam continut HTML: <WebBrowser x:Name="browserControl" /> Pasul urmator este sa ne inregistram la notificarea dorita. Aceasta notificare reprezinta un apel a unei metode din javascript. browserControl.ScriptNotify += new EventHandler<NotifyEventArgs>(BrowserControl_ScriptNotify); ... void browserControl_ScriptNotify(object sender, NotifyEventArgs e) { ... } In acest moment toate mesajele de notificare o ...