WinRT HttpClient erster Versuch

Viele Wege führen nach Rom. Im vorigen Blog habe ich gezeigt wie man klassische RSS oder Atom Feeds konsumiert.  Dafür waren ganze 5 Zeilen Code nötig.

Im nächsten Versuch verwende ich den eingebauten HTTP Stack manuell und ergänze das Beispiel um die Möglichkeit einen Hyperlink zu öffnen. Hier zeigen sich die Unterschiede zu Silverlight und .NET sehr deutlich. Zunächst lautet der Namensraum System.Net.Http in dem sich die HTTPClient Klasse befindet, statt WebClient oder HTTPWebRequest. Dafür kann die Windows 8 managed Klasse viel mehr z.B. Header manipulieren oder in Klassen in die Request oder Response Pipeline hängen. Wenn man folgende Fehlermeldung erhält hat man das Response Limit entdeckt.

Cannot write more bytes to the buffer than the configured maximum buffer size: 65536.

Also den MaxResponseContentBufferSize auf irgendeinen absurd hohen Wert setzen (schön ist das nicht).

Die Rückgabe Zeichenkette muss ebenfalls Async abgearbeitet werden und dann in ein XElement geparst werden. Offensichtlich geht das parsing auch synchron.

Dann ganz einfach per Xlinq eine schön Query absetzen auf RSS Item und link.  Und jetzt ACHTUNG: mit anonymen Typ und Datenbindung geht trotzdem. Also besser als in Silverlight, einmal Zwinkerndes Smiley)

Dim uri As Uri = New Uri("http://www.heise-marktplatz.de/system/RSS/category/7")
Dim http As New HttpClient()
http.MaxResponseContentBufferSize = 20000
Dim ixml = XElement.Parse(Await http.GetStringAsync(uri))
Dim q = From x In ixml.Descendants("item")
             Select New With {.Title = x.Element("title").Value,
                   .Link = x.Elements("link").FirstOrDefault.Value}
Gridview1.ItemsSource = q

Kein ganz sauberer Code, weil mit der Struktur des Feeds die Anwendung steht und fällt.

Mit 8 Zeilen Code etwas länger, dafür im das Binding im XAML um Ecken schöner.

 <GridView HorizontalAlignment="Left" Margin="0,0,0,0" x:Name="Gridview1" >
  <GridView.ItemTemplate>
        <DataTemplate>
          <Canvas Width="200" Height="200" Background="DarkBlue">
                  <HyperlinkButton Tag="{Binding Link}" Click="hyperlinkclick">
                     <TextBlock Text="{Binding Title}"  Width="180" 
Canvas.Top="10" Canvas.Left="10"
TextWrapping="Wrap"/> </HyperlinkButton> </Canvas> </DataTemplate> </GridView.ItemTemplate> </GridView>

Das Windows 8 METRO Beispiel ist wirklich einfach. Bisher fast zum verlieben. Wie sieht's nun aus wenn man den Internet Explorer öffnen möchte. Ganz generell gibt es keine Funktion wie CreateProcess oder ProcessStart. Das einzige was geht ist die Verbindung der Dateierweiterung mit einem Programm. Das muss der Benutzer aber per Hand erledigen. Folglich startet ein Aufruf eines Hyperlinks  per LaunchUri auch den IE 10 (METRO).

 Private Async Function hyperlinkclick(sender As Object, e As RoutedEventArgs) As Task
        Await Launcher.LaunchUriAsync(New Uri(e.OriginalSource.Tag))
End Function

Das muss man auch wieder asynchron tun.

So ganz nebenbei. Der HyperlinkButton hat in WinRT anders als in Silverlight kein NavigateUri Attribut. Man muss also Tricksen und per Binding des Tag die URL mitgeben und dann im Event behandeln.

Im Simulator dann folgendes Bild mit auswählbaren Elementen und clickbaren Text.

image

Kommentar schreiben