Die guten alten ASP.net Web Services sollten eigentlich schon seit .net knapp 10 Jahren durch WCF abgelöst werden. Aber ASMX findet sich auch heute noch, teilweise auch neu implementiert in vielen Software Projekten. Es ist einfach zu programmieren, zu hosten und zu troubleshooten. Selbst SharePoint bietet eine Reihe von Schnittstellen als ASP.NET Web Service an.
Als Basis dient folgender sehr einfacher ASMX Service, der in einem eigene Projekt innerhalb der Windows 8 Store APP Visual Studio 2012 Solution angelegt wird (vormals METRO).
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WebService1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function GetKunden() As List(Of kunde)
Dim l As New List(Of kunde)
l.Add(New kunde With {.ID = "1", .isMale = True, .FamName = "Mayer", .Vorname = "Klaus"})
l.Add(New kunde With {.ID = "9", .isMale = False, .FamName = "Becker", .Vorname = "Verona"})
l.Add(New kunde With {.ID = "13", .isMale = True, .FamName = "Weber", .Vorname = "Gerhard"})
l.Add(New kunde With {.ID = "31", .isMale = True, .FamName = "Müller", .Vorname = "Thorsten"})
Return l
End Function
End Class
Public Class kunde
Property ID As String
Property Vorname As String
Property FamName As String
Property isMale As Boolean
End Class
Um diesen Service zu nutzen erzeugen die meisten im Visual Studio Projekt per Add Service Reference und URL des Services die Proxy Klassen im Projekt. In einer Winforms Anwendung (nach wie vor) kann man das mehr oder minder direkt über den Zusatzdialog “Advanced” tun.
Diese Option fehlt bei Windows 8 Apps, schlicht weil es dort kein .net 2.0 mehr gibt.
Auf den ersten Blick ist das auch nicht nötig, weil man das auch direkt ganz gut hinbekommt.
Allerdings muss im Gegensatz zu Windows Forms in der WinRT, die Kommunikation Asynchron abgehandelt werden. Das erzeugt ganz neue Problemstellungen für den .NET Code bzw. der VB.NET Source kann nicht direkt wieder verwendet werden.
Dim svc As New ServiceReference1.WebService1SoapClient
Private Async Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Dim resp = Await svc.GetKundenAsync()
liste1.ItemsSource = resp.Body.GetKundenResult
End Sub
Der nötige XAML Code mit einem Listeview Steuerelement in der Page
<ListView x:Name="liste1">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding VorName}" Padding="0,0,5,0"/>
<TextBlock Text="{Binding FamName}" FontWeight="Bold" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Letztendlich die Ausgabe der Windows 8 APP
Noch ein Paar Hintergrund Infos. Da Windows 8 .NET 4.5 verwendet, kommen eigentlich WCF Proxys zum Einsatz. Microsoft hat allerdings im WCF Bereich ob des konfigurations Desasters auf die App.Config verzichtet. Statt “Contract First” lautet nun die Devise Konvention über Konfiguration.
Also wo findet man nun die nötigen Parameter. Im Code- der reference.vb.
Den kann man natürlich ändern, muss aber in Kauf nehmen, das wenn die Service Reference aktualisiert wird, die Änderungen weg sind.