Silverlight RSS Feeds einlesen

Datenbinding ist meiner Ansicht nach nur unzureichend gelöst in Silverlight. Die .NET RIA Services sind auch noch bei weitem nicht fertig. Selbst die Neue Version Silverlight 3 bringt nur ganz wenig Änderungen zum Thema Datenbinding. Mein Problem ist, das man unglaublich viel Infrastruktur Arbeit machen muss, um die typische Customer Tabelle von der Nordwind Datenbank anzuzeigen. Und es gibt mindestens fünf oder mehr Möglichkeiten das zu tun. Erinnert mich irgendwie an RDO und ADO und ODBC usw. Aber das ist eine andere Geschichte. Ich will heute mal auf Feature hinwiesen das es schon seit Silverlight 2 gibt die RSS Syndication Klassen. Diese übernehmen die Dreckarbeit mit den Formaten wie RSS und ATOM umzugehen. Wer das schon mal gemacht hat, weis der Teufel liegt im Detail. Der Download erfolgt wie üblich per Webclient und asynchron. Die empfangenen Daten werden dann in einen XAML Reader geladen und dann in eine Liste vom Typ Syndication Feed. Man erspart sich das aufwendige manuelle parsen, Typüberprüfungen und das erstellen einer Datenklasse für die Items. Private Sub OnClick(sender As Object, args As EventArgs) Dim wc As New WebClient() wc.DownloadStringAsync(New Uri("http://http://rss.focus.de/fol/XML/webslice/fol_newsticker.html")) AddHandler wc.DownloadStringCompleted, AddressOf rssCallback End Sub Private Sub rssCallback(sender As Object,e As DownloadStringCompletedEventArgs) Dim reader As XmlReader = XmlReader.Create(New StringReader(e.Result)) Dim feed As SyndicationFeed = SyndicationFeed.Load(reader) datagrid1.ItemsSource = feed.Items End Sub

Silverlight Network Stack- die Qual der Wahl

Silverlight 3 besitzt 2 Network Stacks. Man merkt davon auf den ersten Blick aber nichts und wozu zwei mal das gleiche? Bisher hat Silverlight immer den Browser Network Stack verwendet (XMLHTTP). Dies hat eine Menge Vorteile wie z.B. Cookie Support, Caching von Images und wenig Aufwand. Leider auch einen kleinen und einen erheblichen Nachteil: Nur Statusode 404 und 200 und keine DELETE oder PUT Http Kommandos. Nie und nimmer ( auch wenn manche was anderes behaupten). Das ginge ja noch. So wird bei ADO.NET Dataservice ein entsprechender REST Aufruf einfach in einen POST Request getunnelt. Richtig schlimm wird es aber erst wenn eine Silverlight Anwendung Out off Browser läuft. Wie der Name schon sagt gibt es dann keinen Browser mehr und damit auch keinen Browser Network Stack. Deshalb haben die Jungs vom Silverlight Team den Network Stack in Silverlight nachprogrammiert, nennt sich ClientHttpStack im Gegensatz zum BrowserHttpStack. Allerdings weicht die Implementierung erheblich ab. Caching von Images gibt es z.B. nicht mehr. Man kann für einen einzelnen Webrequest umschalten oder für alles (Images, Webclient, HttpClient, Web Service ect) Dim httpResult As Boolean = WebRequest.RegisterPrefix("http://", _ WebRequestCreator.ClientHttp) Dabei wird für jeweils ein Prefix der ClientHTTP Stack aktiviert. Das kann auch ruhig in der Form http://www ect erfolgen. Das geht allerdings nur einmal pro Anwendungsstart. Dann gehen auch Request auf REST Services mit GET, POST, DELETE, PUT, OPTIONS und HEAD. Wenn eine Cross Domain Zugriff erfolgen soll muss im Clientaccesspolicy File die http-Methods auf * sein. Ansonsten gibts auch hier nur GET und POST. Das Thema ist im Detail sehr Umfangreich. Nur um ein paar Stichwörter zu geben, Cookies, Authentifierung, Header, Caching oder Proxy Settings. Dazu später vielleicht mehr.

Silverlight 3 Download Links

wie von mir schon gepostet ist Silverlight 3 final. Hier sind nun die Links Silverlight Tools für Visual Studio 2008 Blend RC 1 Silverlight Plugin

Silverlight 3 ist fertig

Ich bin  Silverlight Insider und habe entsprechend gegenüber Microsoft unterschrieben nichts von den Internas zu erzählen. Aber eines kann ich verraten (da im Web recherchiert),Silverlight  3 wird in San Francisco um 10:00 Ortszeit vorgestellt. Da ich seit Wochen mit den (häufig wechselnden) RTW (Release to Web) Bits arbeite, kann ich nur anmerken “knapp aber doch”. Dazu kommen natürlich Silverlight Tools für Visual Studio 2008, SDK und das Silverlight Toolkit. Einzig die .NET RIA Services und Expression Blend haben noch nicht die Reife für RTW. Es muss aber SL 3 kompatible Bits geben zum Termin, sonst kann man ja nichts entwickeln. Wer sich zwischendurch die Zeit vertreiben möchte, kann sich auf http://www.seethelight.com/ einen Counter dazu ansehen. Also Download starten spätestens am Freitag Nachmittag. Da die Microsoft Download Server ca 24 h brauchen um weltweit am Stand zu sein werden die ersten Links in den nächsten Stunden auftauchen Das Update von 2 für die bestehenden Installationen des Browser Plugins wird ein paar Tage später per Autoupdate ( so es der User aktiviert hat) ausgerollt. Silverlight 2 Anwendungen laufen auch mit dem 3er Plugin. Das 3er Plugin wird nur unwesentlich größer werden.

Silverlight 3 Element to Element Binding

In Silverlight 2 musste man richtig viel Aufwand treiben um einen Slider beim verschieben den Wert in eine Textbox zu schreiben ( und umgekehrt) Das funktioniert nun mit SL 3 richtig lässig per XAML Deklaration ohne jeden Code. Ganz nebenbei wird das Binding nun auch bei jeder Änderung aktiviert und nicht erst bei Lostfocus. Im Binding wird das nun per “ElementName” gelöst. <Slider Minimum="0" Maximum="360" x:FieldModifier="slider1"   Value="{Binding Text, ElementName=text1, Mode=TwoWay}"     Width="400" VerticalAlignment="Top" Margin="0,20,0,0" /> <TextBox x:Name="text1" Text="{Binding value, ElementName=slider1, Mode=TwoWay}" Height="20"> </TextBox>

Wo bist Du hin? ScaleMode= Zoom

In Silverlight 2 Projekten erzeugt Visual Studio zwei Dateien für das Hosting des Silverlight Plugin’s. Eine ASPX die bei F5 aufgerufen wird und eine HTML die man per “View in Browser” starten kann. Das ist bei Silverlight 3 auch so, nur hat Microsoft nun auf das ASP.NET Silverlight Server Control verzichtet das in der ASPX Seite verwendet wurde. Statt dessen wird nun einheitlich per Object Tag Das Silverlight Plugin eingebettet. Früher gab es auch noch eine Jscript Methode. <div id="silverlightControlHost">         <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">     <param name="source" value="ClientBin/SilverlightApplication1.xap"/>     <param name="onError" value="onSilverlightError" />     <param name="background" value="white" />     <param name="minRuntimeVersion" value="3.0.40623.0" /> Das wäre nicht weiter schlimm, wenn es da in dem ASP.NET Control nicht ein Attribut (Scalemode) gegeben hätte, das es erlaubt den Inhalt (XAML) mit der Größe des Browser Fensters mit zu zoomen. Das Object Element kann das nämlich nicht. Im Klartext: Silverlight 3 kann etwas nicht, was Silverlight 2 kann. Das ASP.NET Server Control funktioniert aber noch unter SL3. Man muss nur die Datei System.Web.Silverligth.DLL ins BIN Verzeichnis kopieren. Dafür gibt es ein cooles Neues Feature das auch vom Object Element direkt verwendet werden kann.    <param name="enableautozoom" value="true"/> Mit Enable Autozoom vergrößert die Silverlight Anwendung mit der Skalierung des Browsers mit. Linear Größe, Schriften und Grafiken!

Silverlight 3 GetName

Wie Kollege Fischer in einem Blog Eintrag anmerkt, soll in einer Aufzählung GetName fehlen. Mit GetName kann man den Namen in einer Enumeration (Liste) herausfinden. Die SL 3 Doku beschreibt das jedenfalls. Methode aus Enum     GetName Retrieves the name of the constant in the specified enumeration that has the specified value. Public Class Example    Enum Colors       Red       Green       Blue       Yellow    End Enum 'Colors    Enum Styles       Plaid       Striped       Tartan       Corduroy    End Enum 'Styles    Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock)       outputBlock.Text += String.Format("The 4th value of the Colors Enum is {0}", [Enum].GetName(GetType(Colors), 3)) & vbCrLf       outputBlock.Text += String.Format("The 4th value of the Styles Enum is {0}", [Enum].GetName(GetType(Styles), 3)) & vbCrLf    End Sub 'Main End Class 'GetNameTest

Out of Browser und Silverlight 3 RTW

Die neue Funktion out of Browser erlaubt es Silverlight Anwendungen auch Offline zu betreiben. Das wird hier in einem Video gezeigt. Nur leider wird die RTW ( Release to web) erhebliche Änderungen mit sich bringen ( und das diese Woche noch!). Das Beispiel von der Silverlight Website kompiliert nicht mehr. Neben der Änderungen im Code wird nun statt im Appmanifest in einer neuen Datei OutofbrowserSettings.xml die Konfiguration vorgenommen. <OutOfBrowserSettings ShortName="OutOfBrowser Application" EnableGPUAcceleration="True" ShowInstallMenuItem="True">   <OutOfBrowserSettings.Blurb>OutOfBrowser Application on your desktop; at home, at work or on the go.</OutOfBrowserSettings.Blurb>   <OutOfBrowserSettings.WindowSettings>     <WindowSettings Title="OutOfBrowser Application" Height="400" Width="600" />   </OutOfBrowserSettings.WindowSettings>   <OutOfBrowserSettings.Icons>     <Icon Size="16,16">Icons/task16.png</Icon>     <Icon Size="32,32">Icons/task32.png</Icon>     <Icon Size="48,48">Icons/task48.png</Icon>     <Icon Size="128,128">Icons/task128.png</Icon>   </OutOfBrowserSettings.Icons> </OutOfBrowserSettings> Das muss man aber nicht selbst tun. Über die Projekt Eigenschaften lässt sich das visuell konfigurieren. Eine derartige ausgestattet Silverlight Anwendungen lässt sich dann auch ins Windows Menü installieren. Abschließend auch noch der geänderte Code damit die Demo Anwendung wieder läuft Namespace OutOfBrowser Partial Public Class App Inherits Application Public Sub New() AddHandler Me.Startup, AddressOf Application_Startup AddHandler Me.Exit, AddressOf Application_Exit AddHandler Me.UnhandledException, AddressOf Application_UnhandledException AddHandler InstallStateChanged, AddressOf App_ExecutionStateChanged InitializeComponent() End Sub Private Sub App_ExecutionStateChanged(ByVal sender As Object, ByVal e As EventArgs) 'Update B2 -> RTW If App.Current.InstallState = Windows.InstallState.NotInstalled Then MessageBox.Show( "Restart the applicaiton to use the latest bits.") End If End Sub Private Sub Application_Startup(ByVal sender As Object, ByVal e As StartupEventArgs) Me.RootVisual = New MainPage() End Sub Private Sub Application_Exit(ByVal sender As Object, ByVal e As EventArgs) End Sub Private Sub Application_UnhandledException(ByVal sender As Object, ByVal e As ApplicationUnhandledExceptionEventArgs) ' If the app is running outside of the debugger then report the exception using ' the browser's exception mechanism. On IE this will display it a yellow alert ' icon in the status bar and Firefox will display a script error. If (Not System.Diagnostics.Debugger.IsAttached) Then ' NOTE: This will allow the application to continue running after an exception has been thrown ' but not handled. ' For production applications this error handling should be replaced with something that will ' report the error to the website and stop the application. e.Handled = True Deployment.Current.Dispatcher.BeginInvoke( Function() AnonymousMethod1(e)) End If End Sub Private Function AnonymousMethod1(ByVal e As ApplicationUnhandledExceptionEventArgs) As Boolean ReportErrorToDOM(e) Return True End Function Private Sub ReportErrorToDOM(ByVal e As ApplicationUnhandledExceptionEventArgs) Try Dim errorMsg As String = e.ExceptionObject.Message + e.ExceptionObject.StackTrace errorMsg = errorMsg.Replace( """"c, "'"c).Replace(Constants.vbCrLf, Constants.vbLf) System.Windows.Browser.HtmlPage.Window.Eval( "throw new Error(""Unhandled Error in Silverlight Application " & errorMsg & """);") Catch e1 As Exception End Try End Sub End Class End Namespace   und in Mainpage Namespace OutOfBrowser Partial Public Class MainPage Inherits UserControl Public Sub New() InitializeComponent() AddHandler Loaded, AddressOf MainPage_Loaded AddHandler NetworkChange.NetworkAddressChanged, AddressOf NetworkChange_NetworkAddressChanged End Sub Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) If App.Current.IsRunningOutOfBrowser Then InstanceMode.Text = "Out of Browser" Else InstanceMode.Text = "In Browser" End If End Sub Private Sub NetworkChange_NetworkAddressChanged(ByVal sender As Object, ByVal e As EventArgs) If NetworkInterface.GetIsNetworkAvailable() Then ConnectivityIndicator.Text = "Connected (online)" ConnectivityIndicator.Foreground = New SolidColorBrush(Colors.Green) ' check for updates from IsoStore ' push updates via web services to keep in sync Else ConnectivityIndicator.Text = "Disconnected (offline)" ConnectivityIndicator.Foreground = New SolidColorBrush(Colors.Red) ' Save current data to IsoStore for offline use End If End Sub Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim allowed As Boolean = App.Current.Install() If allowed Then ' do something here. End If End Sub Private Sub Button_Click_1(ByVal sender As Object, ByVal e As RoutedEventArgs) If NetworkInterface.GetIsNetworkAvailable() Then ' save online using web service End If ' use IsolatedStorage because we're offline End Sub End Class End Namespace

IIS 7 LocalSqlServer nicht gefunden

Wir haben hier einen Windows 2008 Webserver mit IIS7, auf dem laufen jede Mengen Anwendungen erfolgreich und seit langer Zeit. Nun habe ich eine neues Silverlight 3 Programm für das ich eine virtuelle Anwendung erzeugt habe. Da gehört auch ein WCF Service dazu. Serverfehler in der Anwendung /svcs1. Konfigurationsfehler Beschreibung: Fehler beim Verarbeiten einer Konfigurationsdatei, die für diese Anforderung erforderlich ist. Überprüfen Sie die unten angegebenen Fehlerinformationen, und ändern Sie die Konfigurationsdatei entsprechend. Parserfehlermeldung: Der Verbindungsname LocalSqlServer wurde in der Anwendungskonfiguration nicht gefunden, oder die Verbindungszeichenfolge war leer. Quellfehler:   Zeile 164:connectionStringName="LocalSqlServer" Zeile 165:applicationName="/" Zeile 166:type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Zeile 167: Zeile 168:            </providers> Quelldatei: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\machine.config    Zeile: 166 Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.4016; ASP.NET-Version:2.0.50727.4016   Ziemlich uncool die Fehlermeldung. Vor allem, was soll das mit dem LocalSqlServer String? Das ganze ist ja in der machine.config angelegt und die ist seit Installation des Systems unverändert. Der Connection String wird ja auch nur benötigt wenn man die Standard Membership Funktion mit dem SQLExpress Server verwendet. Das tue ich aber nicht. Strukturierte Fehlersuche zunächst einmal wildes rumraten in der machine.config. Dann Einsicht: “die anderen Anwendungen laufen ja- es muss an der Anwendung liegen”. Dann leere Anwendung im IIS erstellen und test.aspx erzeugt. Auch Fehler. Was ist nun noch ein Unterschied? Web.config. Also Web.Config von funktionierender Anwendung kopiert und : geht! Nun in Web Config der Silverlight Anwendung einfach den Rolemanager entfernt. Das geht in IIS mit der modularen Architektur ganz wunderbar. <roleManager enabled="false"> <providers> <remove name="AspNetSqlRoleProvider"/> </providers> </roleManager> Überraschung: meine Silverlight Anwendung läuft. Es muss wohl ein Kompatibilitäts Problem sein mit dem Roleprovider aus  IIS7 und net 3.5 SP1. Wieder mal ein Beispiel für absolut bescheuerte Fehlermeldungen.

Was Silverlight nicht kann: Right to left

In der letzten Silverlight 2 Schulung fragte ein Teilnehmer nach Unterstützung für Rechts nach Links schreiben. Dies wird für Textboxen bei manchen arabischen Schriften benötigt. Muss zugeben ich wusste keine Antwort. Genau für diesen Fall betreibe ich das Blog. Wenn ich die Anwort dann kenne, gibts hier ein Post dazu, Also kein Right to left Support in Silverlight 1 und 2. Auch in 3 ist das nicht geplant. Zwar wird schon an der 4er Version entwickelt aber da komm selbst ich an keine Infos ran. (und wenn, darf ich es nicht sagen oder müsste den Leser sofort töten ;-)) Einzig der Link auf ein Control http://silverlightrtl.codeplex.com/ hilft hier.