In einem früheren Blog Post habe ich gezeigt, wie man die neue ASP.NET Web API als REST basierte Service Schicht einsetzen kann, Dabei braucht man auch nicht das komplette ASP.NET MVC 4 Projekt. Mein VB.NET Beispiel erweitert eine bestehende ASP.NET Website.
Die Datei Global.asax.vb imWeb Verezeichnis muss die Routing Regel implementieren und braucht zwei Namensräume.
Imports System.Web.Routing
Imports System.Web.Http
Public Class Global_asax
Inherits System.Web.HttpApplication
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RouteTable.Routes.MapHttpRoute(
name:="DefaultApi",
routeTemplate:="api/{controller}/{id}",
defaults:=New With {.id = RouteParameter.Optional}
)
End Sub
Dann wird im Web Projekt eine neue Klasse Web API Controller angelegt. Der Name setzt sich zusammen aus [Daten}Controller, also hier kundencontroller.vb
In diesem WInrt Beispiel wird allerdings nur die REST GET Methode implementiert. Die Datei mit der Liste von Vornamen wird im APP_Data Verzeichnis abgelegt. Da der Controller nicht direkt in der ASP.NET Pipline lauft, kann man Server.Mappath nicht verwenden. Mein Workaround ist die Appdomain und das DataDirectory.
Public Class KundenController
Inherits ApiController
' GET /api/<controller>
Public Function GetValues() As IEnumerable(Of String)
Return File.ReadAllLines(AppDomain.CurrentDomain.GetData("DataDirectory") + "\vorname.txt")
End Function
Für den Funktionstest einfach im Browser api/kunden aufrufen.
METRO Windows 8 Anwendung
Im VB.NET Client wird per HTTP Client der Service aufgerufen und als Objekt im Json Format zurück geliefert. Per Parse wird daraus ein Array von JsonObject Elementen. Aus diesem wird per LINQ Abfrage der String extrahiert und eine generische Liste erzeugt. in diesem Fall von Strings. q kann man dann ganz einfach an eine GridView binden.
Private Async Function Button_Click_1(sender As Object, e As RoutedEventArgs) As Task
Dim uri As Uri = New Uri("http://localhost:12933/api/kunden")
Dim http As New HttpClient()
Dim j As JsonArray
j = JsonArray.Parse(Await http.GetStringAsync(uri))
Dim q = From item In j
Select item.GetString
Gridview1.ItemsSource = q
End Function