HowTo: Erstellen eines WCF RIA Service für WP7

Um beispielsweise mit dem Windows Phone auf eine Datenbank zugreifen zu können, wird ein WebService benötigt. Die Erstellung eines solchen Services ist nicht sehr aufwändig, da vieles im Hintergrund generiert wird. Folgend ein kleines HowTo.

1. Erstellung des Models mit dem EntityFramework

Öffnet Visual Studio und erstellt zunächst ein leeres ASP.NET Projekt.

1_NewProject

Fügen Sie dem Projekt anschließend ein ADO.NET Entity Data Model hinzu, zu finden im Bereich Data.

3_AddDataModel

Wählen Sie dort Generate from Database und wählen dann im darauf folgenden Schritt die gewünschte Datenbank aus. In meinem Fall habe ich hier die NorthwindOA-Datenbank gewählt.

4_SelectDB

Selektieren Sie dann die gewünschten Tabellen, auf die später unsere kleine Windows Phone App zugreifen soll.

5_SelectTables

Nach einem Klick auf Finish werden anschließend alle Entitäten vom Entity Framework generiert und als Diagramm dargestellt.

6_GeneratedDB

Jetzt ist es erforderlich, ein Build durchzuführen. Wird haben nun unser fertiges Model.

2. Erstellung des DomainService

Fügen Sie unserem Projekt ein Domain Service hinzu, zu finden im Bereich Web.

7_CreateDomainService

Im Anschluss öffnet sich ein Fenster, bei dem Sie ihr generiertes Model auswählen können. Sollte sich Ihr Model nicht in der ComboBox befinden, haben Sie vermutlich den Build vergessen ;-) Selektieren Sie außerdem die gewünschten Entitäten und zudem noch Expose OData Endpoint. Dieser wird später durch einen Soap-Endpoint ersetzt.

8_DomainConfig

Fügen Sie dann ihrem Projekt eine Referenz zur Assembly Microsoft.ServiceModel.DomainServices.Hosting.dll hinzu. Diese stammt aus dem Ria Service Toolkit. Nach der Installation des Toolkits befindet sich die Assembly in %ProgramFiles%\Microsoft SDKs\RIAServices\v1.0\Toolkit\Libraries\Server.

9_Reference

Jetzt muss nur noch der Soap-Endpoint hinzugefügt werden. Da wir beim Erstellen des Domain Service angegeben haben, dass ein OData-Endpoint erstellt werden soll, wurde uns schon etwas Arbeit abgenommen. Es muss jetzt nur noch der OData- mit dem Soap-Endpoint getauscht werden. Geht in eure Web.config und ändert diese wie folgt…

<system.serviceModel>
<domainServices>
<endpoints>
<!--<add name="OData" type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />-->
<add name="soap" type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</endpoints>
</domainServices>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

3. Testzugriff und Adresse des RIA Service


Der Service ist nun fertig. Doch wie lautet nun dessen Adresse? Die Adresse wird nach folgenden Schema aufgebaut…


http://localhost:[portnumber]/[SLprojectName]-Web-[DomainsServiceName].svc


Den Port findet man ganz einfach heraus, indem man entweder das Projekt einmal testweise startet. Alternativ legt man in den Projekteigenschaften im Bereich Web einen beliebigen Port fest.


Gebt man die Adresse dann im Browser ein, öffnet sich folgende Testseite…


10_TestPage


Der WCF RIA Service ist fertig! Jetzt fehlt nur noch eine Testanwendung, die den Service verwendet.


4. Entwickeln der Windows Phone App


Fügt als erstes der Solution ein neues Windows Phone Projekt hinzu.


11_PhoneApp


Editiert anschließend etwas eure MainPage.xaml, damit die Daten über den Service geladen und angezeigt werden können.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<ListBox x:Name="lbxCustomers" Height="520" />
<Button x:Name="cmdLoad" Content="Lade Customers..." Margin="5"
Click="cmdLoad_Click"/>
</StackPanel>
</Grid>

Damit auf den Service zugegriffen werden kann. Muss eine Service Referenz hinzugefügt werden. Klickt einfach mit der Rechten Maustaste auf das Windows Phone Projekt. Dort findet man dann Add Service Reference, worauf hin sich dann ein Dialog öffnet. Gibt dort dann die Adresse des Service an und klickt auf Go. Gebt eurer Service Referenz dann noch einen Namen, in meinem Fall NwService, und klickt dann auf OK.


12_ServiceRef


Damit alle Änderungen übernommen werden und die Service Referenzen aktualisiert werden, muss jetzt wieder ein Build durchgeführt werden.


Jetzt wird das erste und einzige Mal echter Code geschrieben. Öffnet dazu die MainPage.xaml.cs, fügt dass Using-Statement hinzu, erstellt eine Instanz euer des SoapClient, welcher als Proxy dient, registriert das Completed-Event und startet einen Asynchronen Aufruf.

using WindowsPhoneApp.NwService;

namespace WindowsPhoneApp
{
public partial class MainPage : PhoneApplicationPage
{
/// <summary>
/// The service proxy.
/// </summary>
NwDomainServicesoapClient _proxy;

public MainPage()
{
InitializeComponent();

_proxy = new NwDomainServicesoapClient();
_proxy.GetCustomersCompleted += new EventHandler<GetCustomersCompletedEventArgs>(_proxy_GetCustomersCompleted);
}

/// <summary>
/// Starts loading the customers async.
/// </summary>
private void cmdLoad_Click(object sender, RoutedEventArgs e)
{
_proxy.GetCustomersAsync();
}

/// <summary>
/// Is fired, when the async loading of customers is completed.
/// </summary>
void _proxy_GetCustomersCompleted(object sender, GetCustomersCompletedEventArgs e)
{
// Clear the list
this.lbxCustomers.Items.Clear();

// Fill the list with customer data
foreach (Customers c in e.Result.RootResults)
{
this.lbxCustomers.Items.Add(c.ContactName);
}
}
}
}

Jetzt kann man das Projekt starten. Der Emulator öffnet sich und nach einem Klick auf den Button werden die Namen der Customer aus der Northwind-Datenbank in einer Liste ausgegeben.


14_Ready


Natürlich werden nicht nur Read, sondern alle CRUD-Befehle unterstützt. Mehr dazu aber in einem anderen Post.

Comments

Popular posts from this blog

How to setup an eGPU on Ubuntu for TensorFlow

Why should I install TensorFlow from Source?

Benchmarking Tensorflow Performance on eGPU