Dienstag, 28. Juni 2011

Der Out-of-browser Schock

Ich habe unlängst versucht eine bestehende Silverlight Applikation "Out-of-browser" zu bringen. Die Applikation verwendet eine Art Bootstrapper der im Application_Startup Ereigniss gestartet wird. Dieser Bootstrapper führt eine Reihe von Serviceaufrufen durch um bestimmte Initialisierungen vorzunehmen und Daten zu laden die mein Client später braucht.

Als "In-Browser" Applikation läuft das alles super. Out-of-Browser läuft nichts mehr. Ich bekomme TimeoutExceptions bei einfachen, kurzen Serviceoperationen. Bei meinen Recherechen bin ich mehrfach auch einen Hinweis wie diesen gestoßen:

http://stackoverflow.com/questions/5432286/cross-domain-policies-in-silverlight-out-of-browser

Es handelt sich bei dem Problem nicht um ein Cross-Domain Problem - dann hätte man als Exception ja auch eher eine SecurityException erwartet.

Der Grund scheint zu sein: in einer OOB Applikation kann am aus dem Application_Startup Ereignis keine Services aufrufen bevor das Root Visual gesetzt ist. Die genannte Lösung ist, diesen Code in das Loaded-Ereignis des RootVisual zu schreiben.

Tatsächlich hilft es, das RootVisual zunächst auf ein UserControl zu setzen. Dann werden auch Serviceaufrufe aus der App.xaml.cs heraus ausgeführt. Leider kann man das RootVisual nur einmal setzen. Spätere Setzungen werden einfach ignoriert.

Ungeachtet der Tatasache ob es möglich wäre, die Applikation so umzubauen das die Serviceaufrufe erst nach der Setzung des RootVisuals erfolgen frage ich mich warum das überhaupt sein muss? Warum schafft man so einen strukturellen Unterschied zwischen In-Browser und OOB? Ich hatte gehofft das eine App "einfach so" auch Out of Browser läuft - solange sie nicht die HTML-Bridge benutzt, das versteht sich von selbst.

Ich finde es sehr schade das dies offenbar nicht möglich ist...

Anbei die Punkte die mir bei der Umstellung von In-Browser auf OOB aufgefallen sind:
  • Vor dem ersten Servicecall muss das RootVisual gesetzt werden
  • Vor der Nutzung von HtmlPage sollte mit HtmlPage.IsEnabled geprüft werden ob die HTML Bridge verfügbar ist.
Weitere Punkte werde ich ergänzen so wie sie mir auffallen :-)