Peter Bucher Ralf Westphal

Blog

Nutze den Augenblick
und teile der Welt mit, was Du zu sagen hast.

Mit Silverlight auf den Client zugreifen

Montag, 29. Juni 2009, 14:45 Uhr
Permalink | Kommentare (1) | Kommentare als RSSRSS

Wie kann man aus einer in Silverlight geschriebenen Webanwendung trotz Sandbox auf den zu Grunde liegenden Client zugreifen, um beispielsweise den aktuell angemeldeten Windows-Benutzer zu ermitteln, oder auf spezielle Hardware wie Smartcard-Lesegeräte zuzugreifen?

Die kurze Antwort: Es geht nicht. Otto Fischer schreibt dazu in seinem aktuellen Blog-eintrag Mit Silverlight trotz Sandbox auf Windows-Daten zugreifen. Wahr oder falsch?:

Auf der angegebenen Seite steht dann tatsächlich: “Silverlight – Unter Windows den angemeldeten Benutzer ermitteln”. Das liest sich so, als meine der Autor, er könne den “angemeldeten WINDOWS-Benutzer” ermitteln. Das würde ich wirklich gerne sehen.

Was dann aber gezeigt wird, ist der Zugriff auf HttpContext.Current.User. Och. Das ist aber nicht der Windows-Benutzer. Das ist der Benutzer der Web-Applikation.

Dabei bezieht er sich auf den aktuellen Blogeintrag von Gregor Biswanger, der unter dem Titel Silverlight – unter Windows den angemeldeten Benutzer ermitteln genau dies verspricht. Wie Otto schon korrekt angemerkt hat, ermittelt Gregor aber nicht den aktuell angemeldeten Windows-Benutzer, sondern den der Webanwendung – und das sind unter Umständen zwei verschiedene Benutzer.

Die Frage, die im Raum steht, ist natürlich: Ist es überhaupt möglich, aus Silverlight heraus auf den Client zuzugreifen? Wie oben schon erwähnt, lautet die kurze Antwort, dass dies nicht möglich ist.

Die Begründung liegt schlichtweg in der Sandbox, in der Silverlight ausgeführt wird, und die sämtliche Zugriffe von dem zu Grunde liegenden Client abstrahiert.

Allerdings gibt es zwei potenzielle Workarounds:

Erstens kann die JavaScript-Bridge von Silverlight genutzt werden, um aus der Sandbox auszubrechen und JavaScript auszuführen. Zwar läuft dieses JavaScript nicht mehr innerhalb der Silverlight-Sandbox, sehr wohl aber noch in der JavaScript-Sandbox des Browsers.

Die Nutzung der JavaScript-Bridge bietet sich an, wenn Informationen ermittelt werden sollen, die zwar im Browser zur Verfügung stehen, nicht jedoch in Silverlight. Hierfür seien als Beispiel die aktuellen DPI-Einstellungen genannt, die zur Entwickler einer high DPI-fähigen Anwendung erforderlich sind.

An Stelle der Silverlight-Bridge können auch die von Gregor angeführten Startparameter verwendet werden, doch geht hierbei sämtliche Dynamik verloren: Werte können nur beim Start übergeben werden, danach verhalten sie sich statisch. Auf sich ändernde Umgebungsbedingungen zu reagieren ist mit dieser Technik also nicht möglich.

Zweitens kann auf dem Client zusätzlich zu der Silverlight-Anwendung eine echte Desktopanwendung installiert werden, die beispielsweise als Dienst oder im Systemtray laufen kann. Diese Anwendung hat – da sie nicht an den Browser oder das Silverlight-Addin gebunden ist – vollen Zugriff auf die lokalen Ressourcen, soweit die jeweiligen Benutzerrechte dies gestatten.

Bringt diese Anwendung zusätzlich noch über einen integrierten Webserver, oder wird sie im Rahmen eines leichtgewichtigen Webservers wie beispielsweise XSP ausgeführt, können ihre Dienste problemlos per HTTP in Anspruch genommen werden, was aus einer Silverlight-Anwendung wiederum kein Problem darstellt.

Die Beantwortung der Frage, ob es möglich ist, aus Silverlight heraus auf den Client zuzugreifen, hängt also vom jeweiligen Kontext ab, und davon, welche zusätzlichen Komponenten und Kommunikationskanäle genutzt werden dürfen.

RIA World 2009: Die Qual der Wahl

Samstag, 27. Juni 2009, 11:37 Uhr
Permalink | Kommentare (0) | Kommentare als RSSRSS

Am 23. und 24. Juni 2009 fand in München zum ersten Mal die RIA World statt – eine Konferenz, die sich ausschließlich mit den diversen RIA-Technologien befasst, ohne sich dabei auf eine konkrete Technologie zu spezialisieren.

Ich war dort mit zwei Sessions vertreten, die jeweils als Entscheidungshilfe für die Teilnehmer gedacht waren. Thema meiner ersten Session Die Qual der Wahl: Silverlight, Flex, AJAX, …? war die Frage, welche RIA-Technologie für welche Aufgabe am besten geeignet ist.

Vor 45 Teilnehmern habe ich dabei folgende Themen behandelt:

  • Warum überhaupt RIA?
  • AJAX vs Silverlight und Flex
  • Wann genügt AJAX?
  • Wann genügt AJAX nicht?
  • AJAX und Silverlight / Flex als Hybrid
  • Stärken und Schwächen von Silverlight / Flex
  • Designer vs Entwickler

Direkt im Anschluss daran hatte ich meine zweite Session, die den Titel Sprache für das Web: Statisch vs dynamisch trug. Auch hier war die Fragestellung eine ähnliche: Wann eignet sich welche Programmiersprache, und wo liegen eigentlich die genauen Unterschiede zwischen den verschiedenen Typen von Sprachen.

Vor 25 Teilnehmern habe ich daher folgende Themen behandelt:

  • Was ist Typisierung?
  • Wozu braucht man Typisierung?
  • Statische vs dynamische Typisierung
  • Starke vs schwache Typisierung
  • Explizite vs implizite Typisierung
  • Kategorisierung einiger Sprachen
  • Stärken und Schwächen der jeweiligen Ansätze

Alles in allem hat die gesamte Veranstaltung sehr viel Spaß gemacht, so dass mir an dieser Stelle nur noch bleibt, mich bei den Teilnehmern für die Aufmerksamkeit und die interessanten Fragen zu bedanken. Ich hoffe, dass für jeden interessante Aspekte und hilfreiche Ideen und Anregungen enthalten waren.

Für und wider C# 4.0

Mittwoch, 10. Juni 2009, 00:56 Uhr
Permalink | Kommentare (17) | Kommentare als RSSRSS

Jede in den vergangenen sieben Jahren erschienene Version von C# konzentrierte sich auf einen speziellen Bereich:

  • C# 1.0 war auf Objektorientierung ausgelegt und bildete das äußerst konsistente objektorientierte Modell von .NET auf die eigentliche Sprache ab.
  • C# 2.0 enthielt als wesentliche Neuerung generische Typen. Alle weiteren Features waren letztlich nur für die konsistente Umsetzung dieses Themas erforderlich.
  • C# 3.0 verfügte mit LINQ über die Möglichkeit, nahezu beliebige Datenquellen in einer ausgesprochen effizienten Art auf deklarative Weise abzufragen.

Das besondere an all diesen Versionen von C# war, dass eine bemerkenswerte Konsistenz gegeben war – nicht nur innerhalb der einzelnen Versionen, sondern auch versionsübergreifend.

Auf der PDC 2008 hat Microsoft im Oktober des vergangenen Jahres die kommenden Neuerungen von C# 4.0 vorgestellt. Auch diese Version wird wieder von einem Thema geprägt sein: Der Integration von C# mit dynamischen Sprachen und COM.

Anders als in den vergangenen Versionen fallen die Änderungen dieses Mal allerdings verhältnismäßig kompakt aus, Angekündigt sind derzeit sogar nur vier Features, wobei sich daran bis zur finalen Version von C# 4.0 voraussichtlich auch nichts mehr ändern wird:

  • dynamic-Schlüsselwort: Das Schlüsselwort dynamic erlaubt die Instanziierung von dynamischen Typen, deren Typ erst während der Ausführung festgelegt wird – und der sich sogar ändern beliebig kann. Intern basiert dynamic auf object, erweitert dieses aber um Late Binding.
  • Optionale Parameter: Optionale Parameter ermöglichen es, einzelne Parameter einer Methode bei deren Aufruf auslassen zu können, und statt dessen auf Standardwerte zurückzugreifen. Letztlich erspart sich der Entwickler die Erzeugung verschiedener überladener Varianten einer Methode.
  • Benannte Parameter: Benannte Parameter dienen dazu, einzelne Parameter einer Methode bei deren Aufruf gezielt, das heißt, unabhängig von ihrer Position in der Parameterliste spezifizieren zu können. Dieses Feature ergibt insbesondere in der Kombination mit optionalen Parametern Sinn.
  • Ko- und Kontravarianz: Durch eine verbesserte Ko- und Kontravarianz werden die Möglichkeiten zur Spezialisierung beziehungsweise Generalisierung verbessert. So kann beispielsweise nun List<string> als Ersatz für List<object> verwendet werden, da string von object ableitet – obwohl dies für List<string> und List<object> nicht gilt.

Man mag es bedauerlich finden, dass C# 4.0 nur diese wenigen Änderungen enthält. Potenzial für weitere Aspekte wäre durchaus vorhanden gewesen. Andererseits spricht es für die Reife einer Sprache, wenn eine gewisse Sprachstabilität erreicht wurde und nicht jede neue Version eine Unmenge an weiteren Features enthält.

Wie bereits bei den meisten Neuerungen von C# 3.0 bemüht sich Microsoft auch bei C# 4.0, darauf hinzuweisen, dass dessen Neuerungen nicht für den tagtäglichen Gebrauch gedacht sind, sondern explizit nur der vereinfachten Interoperabilität zu dynamischen Sprachen und vor allem COM dienen.

Bei dem Schlüsselwort dynamic mag dies ohne weitere Erklärung einleuchten, doch wie steht es um die anderen Features?

Ko- und Kontravarianz sind mit Sicherheit nicht nur das am wenigsten beachtete, sondern auch am wenigsten verstandene Merkmal – zugleich jedoch auch das leistungsfähigste. Schließlich ermöglichen diese beiden Aspekte eine deutlich bessere Verwendung von Schnittstellen und implementierenden, aber spezialisierenden Klassen.

Da für die Verwendung dieser erweiterten Ko- und Kontravarianz jedoch auch zwei neue Schlüsselwörter erforderlich sind, ist fraglich, ob sich die Verwendung dieses Feature all zu weit verbreiten wird. Dies wäre schade, allerdings auch nicht tragisch.

Kritisch sind jedoch die beiden übrigen Features: Optionale und benannte Parameter. Das Problem mit diesen ist, dass man zu schnell glaubt, diese verstanden zu haben, ohne es jedoch wirklich getan zu haben. Das Problem liegt in der Implementierung der Standardwerte von optionalen Parametern.

Prinzipiell ist es möglich, optionale Parameter als syntaktisch kompakten Ersatz für die Erzeugung verschiedener überladener Methoden zu verwenden. Für den Aufrufer macht dies keinen Unterschied: Er kann so oder so eine Methode mit weniger Parametern aufrufen, als es für den Aufruf der primären Methode erforderlich wäre.

Allerdings stellt sich die Frage, wie die Standardwerte der fehlenden optionalen Parameter ermittelt werden. Bei einer klassischen Überladung ist die Antwort offensichtlich: Hier stecken die Standardwerte in den überladenen Methoden. Wird ein Standardwert in einer dieser Methoden geändert, wirkt sich das automatisch auf alle Verwender aus – selbst wenn diese sich in einer anderen Assembly befinden, die nicht neu kompiliert wird.

Anders sieht dies jedoch bei der Verwendung optionaler Parameter aus, wie Bernd Marquardt, Neno Loje und ich herausgefunden haben: Hierbei werden die jeweiligen Standardwerte beim Kompilieren in den Code des Verwenders (!) kopiert. Das heißt, dass sich eine Änderung eines Standardwertes eines optionalen Parameters nur dann auf den Verwender durchschlägt, wenn auch dieser neu kompiliert wird.

Sofern sich der Verwender in der gleichen Assembly wie die aufzurufende Methode befindet, geschieht dies auch automatisch. Ist dies jedoch nicht der Fall, wird die betroffene Methode zukünftig mit potenziell falschen oder sogar ungültigen Parametern aufgerufen.

Kritisch hieran ist, dass man einem Methodenaufruf nicht ansieht, ob intern eine überladene Methode oder eine Methode mit optionalen Parametern aufgerufen wird. Es handelt sich also um eine Verletzung des Uniformitätsgesetzes der Informatik, das besagt, dass semantisch verschiedene Dinge auch über eine verschiedene Syntax verfügen sollten.

Was folgt nun aus all diesem? Optionale Parameter sind – wie von Microsoft auch vollkommen korrekt erwähnt – nicht für den tagtäglichen Gebrauch gedacht. Statt dessen sollten sie nur dann Verwendung finden, um eine vereinfachte Interoperabilität zu Legacycode herzustellen – wie beispielsweise im Falle von COM. Man denke nur an die zahlreichen Type.Missing-Angaben bei zahlreichen Aufrufen in das API von Office.

Allerdings werden viele Entwickler optionale Parameter als komfortable Alternative zu überladenen Methoden sehen. Und genau dafür sind optionale Parameter eben nicht gedacht.

Sofern man also weder mit dynamischen Sprachen noch mit COM hantiert, bleibt als einzige relevante Neuerung von C# 4.0 schließlich die Verbesserung von Ko- und Kontravarianz.

Review von Silverlight 2 in Action

Freitag, 5. Juni 2009, 09:10 Uhr
Permalink | Kommentare (2) | Kommentare als RSSRSS

Nachdem ich Silverlight für einige Zeit nur als eine weitere Technologie zur Entwicklung von webbasierten Anwendungen wahrgenommen habe, habe ich nun in den vergangenen Wochen endlich die Zeit gefunden, mich ausgiebig damit zu beschäftigen.

Für den Einstieg habe ich mich daher zunächst mit Literatur versorgt, allen voran mit dem Buch Silverlight 2 in Action von Chad. A Campbell und John Stockton. Verlegt wird das Buch übrigens von Manning Publications, einem Verlag, den ich auf Grund seiner durchwegs sehr guten Bücher immer mehr schätze.

Der Klappentext von Silverlight 2 in Action verspricht eine umfassende und verständliche Einführung für Entwickler, die bereits über Erfahrung in .NET verfügen, wobei technische Details dennoch nicht zu kurz kommen:

It lays out clearly the core techniques you need in order to build Silverlight apps using Visual Studio, and it sparkles with keen insights into the developer/designer workflow.

Das Schöne ist: Dieses Versprechen wird in jeglicher Hinsicht eingehalten. Silverlight 2 in Action baut auf sehr durchdachte Art nach und nach Wissen auf, bleibt dabei jedoch immer verständlich und geht auch auf technische Details ein.

Neben dem grundsätzlichen Thema, wie mit Steuerelementen, Benutzereingaben und Databinding erste einfache Anwendungen erstellt werden können, geht es danach um speziellere Themen. Die Palette reicht dabei von der Integration von WCF über Audio- und Videounterstützung bis hin zu Grafik und Animation.

Abgerundet wird das ganze durch zwei Kapitel, in denen es um Theming, Verteilung und Best Practices im Allgemeinen geht.

Auch kleinere Themen wie beispielsweise die Nutzung des Isolated Storage, die Verwendung von DRM und der Einsatz der JavaScript-Bridge, die eine bidirektionale Kommunikation zwischen Silverlight und HTML ermöglicht, werden angesprochen und ausführlich erläutert.

Der einzige Nachteil von Silverlight 2 in Action ist, dass Silverlight 3 derzeit noch nicht behandelt wird – dies kann den Autoren jedoch nicht wirklich angekreidet werden, da Silverlight 3 hierfür schlichtweg zu neu ist.

Als Ergänzung zu Silverlight 2 in Action empfiehlt sich daher das Blog von Tim Heuer, insbesondere der Post A guide to Silverlight 3 new features.

Alles in allem ist Silverlight 2 in Action also ein sehr empfehlenswertes Buch für jeden Entwickler, der bereits über Erfahrung in .NET verfügt, und der sich einen umfassenden Überblick über Silverlight verschaffen will.

Heißt die Zukunft RIA?

Montag, 1. Juni 2009, 09:37 Uhr
Permalink | Kommentare (1) | Kommentare als RSSRSS

Am 13. Oktober 2008 haben Peter Bucher und ich unter dem Titel Noch Fragen, Bucher? Ja, Roden! angekündigt, jeweils zum ersten eines jeden Monats einen Kommentar zu einem vorab gemeinsam gewählten Thema verfassen zu wollen. Bisher sind in dieser Reihe folgende Kommentare erschienen:

Heute, am 1. Juni 2009, ist es nun wieder so weit, und unser Thema für diesen Monat lautet:

Heißt die Zukunft RIA?

So wohl Peter wie auch ich haben uns unabhängig voneinander im Vorfeld unsere Gedanken gemacht, wie wir diesem Thema gegenüberstehen. Peters Kommentar findet sich zeitgleich in seinem Blog, folgend nun mein Kommentar zu diesem Thema:

Bevor man sich der Frage widmet, ob die Zukunft RIA heißt, gilt es zu klären, was sich überhaupt hinter diesem Begriff verbirgt: Laut Wikipedia handelt es sich bei einer RIA um

eine Anwendung, die Internet-Techniken benutzt und eine intuitive Benutzeroberfläche bietet.

Das Akronym RIA steht dabei für Rich Internet Application. Der englische Begriff Rich steht dabei laut Wikipedia für

die reichhaltigen Möglichkeiten wie zum Beispiel Drag-und-Drop-Fähigkeit oder Bedienbarkeit über Tastenkürzel, suggeriert dabei aber auch einen “Mehrwert” gegenüber herkömmlichen Webanwendungen.

Da die klassischen Webtechnologien die Erstellung solcher Benutzeroberflächen auf Grund von technischen Limitierungen nicht zulassen, assoziieren viele Entwickler RIAs mit solchen Anwendungen, die zwar innerhalb des Browsers laufen, in der Regel jedoch auf zusätzlichen und zumeist proprietären Addins wie beispielsweise Silverlight oder Flash basieren.

Der Einsatz eines solchen Addins ist jedoch keine zwingende Voraussetzung für die Entwicklung einer RIA. So können entsprechende UIs beispielsweise auch nur auf Basis von AJAX erstellt werden. Als Vorreiter für eine AJAX-basierte RIA kann dabei Outlook Web Access gelten, das einen webbasierten Zugriff auf Exchange Server ermöglicht und sich in seiner Bedienung an das Desktopprodukt Outlook anlehnt.

Die Addin-basierte Entwicklung von Anwendunen verfügt jedoch im Vergleich zu AJAX-basierten Varianten über einige Vorteile:

  • Mächtigkeit: Da die Hersteller der Addins nicht an die von den Browsern gesetzten Grenzen gebunden sind, verfügen auf diesen Addins basierende Anwendungen häufig über erweiterte Fähigkeiten. Diese betreffen – da eine solche Anwendung in der Regel nur das webbasierte Frontend einer mehrschichtigen Anwendung darstellt – meistens grafische Aspekte einer Anwendung, wie beispielsweise Animationen, 3D-Grafik, Multimediafähigkeiten, …
  • Plattformübergreifend: Da es zudem Aufgabe des Herstellers eines Addins ist, dafür zu sorgen, dass das Addin in allen verbreiteten Browsern funktioniert, stellt sich für den Entwickler die Frage nach der plattformübergreifenden Entwicklung nicht mehr. Da das Addin im Idealfall auf allen Browserplattformen gleich funktioniert, gibt es für den Entwickler keine Kompatibilitätsprobleme mit den verschiedenen Browsern mehr: Entweder läuft die Anwendung ganz oder gar nicht.
  • Out of Browser: Mit zunehmender Reife ermöglichen es die Addins, für das Web konzipierte Anwendungen mit wenig Aufwand auf den Desktop zu portieren. Hierbei werden unter Umständen gänzlich verschiedene Ansätze verfolgt, wie beispielsweise ein Vergleich der Out of Browser-Features von Silverlight und AIR zeigt.
  • Offline: Spätestens, sobald RIAs auch außerhalb eines Browsers ausgeführt werden können, stellt sich die Frage, inwiefern sie auch ohne bestehende Verbindung zum Internet lauffähig sind. Viele Frameworks unterstützen daher diese Offline-Fähigkeit durch entsprechende APIs und ermöglichen es einer Anwendung, die offline erstellten und geänderten Daten mit einem Server zu synchronisieren, sobald die Anwendung wieder über eine Internetverbindung verfügt.
  • RAD: Im Vergleich zu AJAX-basierten Anwendungen können Addin-basierte Anwendungen wesentlich schneller entwickelt werden, da sich der Entwickler auf die eigentliche Anwendung konzentrieren kann, ohne sich zusätzlich noch um einen Teil der Infrastruktur kümmern zu müssen.

Nimmt man all diese Aspekte zusammen, und beachtet zusätzlich den seit Jahren bestehenden Trend, Anwendungen in das Internet zu verlagern, dann liegt auf der Hand, dass RIAs eine große Zukunft bevorsteht. Es fragt sich nur: Wofür?

Auf Grund der oben genannten Fähigkeiten zu glauben, RIAs seien die universelle Lösung und die Zukunft schlechthin, ist reichlich naiv: Egal, für welche Plattform man sich als Entwickler entscheidet – RIAs haben systembedingte, immanente Nachteile, die man mit gleich welcher RIA-Technologie nicht lösen können wird.

Allen voran sei hier die Sandbox genannt, welche die Addins den Anwendungen in der Regel setzen: Weder besteht direkter Zugriff auf die unter Umständen sehr spezielle Hardware des Clients, noch kann eine RIA Arbeits- und Festplattenspeicher in dem Maße nutzen wie dies für eine klassische Desktopanwendung möglich ist.

Führt man sich vor Augen, dass für viele Aufgaben Bedarf an spezieller Hardware besteht – man denke nur an Lesegeräte für Smartcards oder Chipkarten – oder dass viele Berechnungen große Mengen an Speicher und / oder Prozessorleistung benötigen, wird offensichtlich, dass RIAs hierfür weniger geeignet sind.

In der Praxis werden sich RIAs daher für komplexe Anwendungen insbesondere für die UI etablieren, denn genau hierin liegen die Stärken. Der Middletier sowie das Backend werden sich allerdings nach wie vor auf einem dedizierten Webserver und nicht auf dem lokalen System befinden – schlichtweg, weil dort mehr Möglichkeiten gegeben sind, die für die Businesslogik und ähnliche Bereiche einer Anwendung interessant sind.

Tritt man nun einen Schritt zurück, so erkennt man, dass weder RIAs noch einzelne Addins per se die Zukunft sind, sondern dass sie lediglich eine weitere Option für die Implementierung des Frontends und damit der UI einer Anwendung darstellen.

Und selbst hierfür muss je nach Kontext entschieden werden, ob eine RIA überhaupt Sinn ergibt: Nicht für jede Webseite und nicht für jede Anwendung ist es sinnvoll, diese zukünftig als RIA zu bauen – bloß, weil man nun die Möglichkeit dazu hat.

Langer Rede kurzer Sinn: Die Zukunft heißt nicht pauschal RIA – dafür sind die Konzepte zu sehr auf die Entwicklung von UIs ausgelegt. Doch beschränkt man die ursprüngliche Frage auf den Bereich der Frontends, so können RIAs ihre Fähigkeiten dort – den entsprechenden Kontext und damit den Sinn für den Einsatz einer RIA vorausgesetzt – perfekt ausspielen.