Zugreifen auf WCF-Dienste mit einer Windows Store-Client-App

Mit Windows 8 wird ein neuer Anwendungstyp, die so genannten Windows Store-Anwendungen, eingeführt. Diese Anwendungen sind für Touchscreenoberflächen konzipiert. .NET Framework 4.5 ermöglicht Windows Store-Anwendungen das Aufrufen von WCF-Diensten.

WCF-Unterstützung in Windows Store-Anwendungen

Innerhalb einer Windows Store-Anwendung ist ein Teilbereich der WCF-Funktionen verfügbar. Ausführliche Informationen finden Sie in den folgenden Abschnitten.

Wichtig

Verwenden Sie die WinRT-Syndication-APIs anstelle der von WCF verfügbar gemachten APIs. Weitere Informationen finden Sie unter , WinRT-Syndication-API

Warnung

Das Hinzufügen eines Webdienstverweises zu einer Windows Runtime-Komponente unter Verwendung von „Dienstverweis hinzufügen“ wird nicht unterstützt.

Unterstützte Bindungen

Die folgenden WCF-Bindungen werden in Windows Store-Anwendungen unterstützt:

  1. BasicHttpBinding

  2. NetTcpBinding

  3. NetHttpBinding

  4. <xref:System.ServiceModel.CustomBinding>

Die folgenden Bindungselemente werden in Windows Store-Anwendungen unterstützt

  1. BinaryMessageEncodingBindingElement

  2. TextMessageEncodingBindingElement

  3. ConnectionOrientedTransportBindingElement

  4. SslStreamSecurityBindingElement

  5. WindowsStreamSecurityBindingElement

  6. TcpTransportBindingElement

  7. HttpTransportBindingElement

  8. HttpsTransportBindingElement

  9. TransportSecurityBindingElement

Sowohl textbasierte als auch binäre Codierungen werden unterstützt. Alle WCF-Übertragungsmodi werden unterstützt. Weitere Informationen finden Sie unter Nachrichtenübertragung per Stream.

Dienstverweis hinzufügen

Um einen WCF-Dienst aus einer Windows Store-Anwendung aufzurufen, verwenden Sie die Funktion „Dienstverweis hinzufügen“ in Visual Studio 2012. Sie werden bei Verwendung von „Dienstverweis hinzufügen“ innerhalb einer Windows Store-Anwendung einige Funktionsunterschiede bemerken. Als erstes wird keine Konfigurationsdatei generiert. Da Windows Store-Anwendungen keine Konfigurationsdateien verwenden, müssen sie im Code konfiguriert werden. Dieser Konfigurationscode befindet sich in der Datei „References.cs“, die durch „Dienstverweis hinzufügen“ generiert wird. Um die Datei anzuzeigen, müssen Sie im Projektmappen-Explorer „Alle Dateien anzeigen“ auswählen. Die Datei befindet sich innerhalb des Projekts unter dem Knoten „Dienstverweise“ und dann „Reference.svcmap“. Alle Vorgänge, die für WCF-Dienste in einer Windows Store-Anwendung generiert werden, werden unter Verwendung des taskbasierten asynchronen Musters asynchron implementiert. Weitere Informationen finden Sie unter Taskbasiertes asynchrones Muster.

Da die Konfiguration nun im Code generiert wird, werden alle Änderungen in der Datei „Reference.cs“ überschrieben, sobald der Dienstverweis aktualisiert wird. Um diese Situation zu vermeiden, wird der Konfigurationscode innerhalb einer partiellen Methode generiert, die Sie in der Clientproxyklasse implementieren können. Die partielle Methode wird folgendermaßen deklariert:

static partial void Configure(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials);  

Sie können diese partielle Methode implementieren und die Bindung oder den Endpunkt in der Clientproxyklasse wie folgt ändern:

public partial class Service1Client : System.ServiceModel.ClientBase<MetroWcfClient.ServiceRefMultiEndpt.IService1>, MetroWcfClient.ServiceRefMultiEndpt.IService1 { static partial void Configure(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials) { if (serviceEndpoint.Name == ServiceRefMultiEndpt.Service1Client.EndpointConfiguration.BasicHttpBinding_IService1.ToString()) { serviceEndpoint.Binding.SendTimeout = new System.TimeSpan(0, 1, 0); } else if (serviceEndpoint.Name == ServiceRefMultiEndpt.Service1Client.EndpointConfiguration.BasicHttpBinding_IService11.ToString()) { serviceEndpoint.Binding.SendTimeout = new System.TimeSpan(0, 1, 0); clientCredentials.UserName.UserName = "username1"; clientCredentials.UserName.Password = "password"; } else if (serviceEndpoint.Name == ServiceRefMultiEndpt.Service1Client.EndpointConfiguration.NetTcpBinding_IService1.ToString()) { serviceEndpoint.Binding.Name = "MyTcpBinding"; serviceEndpoint.Address = new System.ServiceModel.EndpointAddress("net.tcp://localhost/tcp"); } } }  

Serialisierung

Die folgenden Serialisierungsprogramme werden in Windows Store-Anwendungen unterstützt:

  1. DataContractSerializer

  2. DataContractJsonSerializer

  3. XmlSerializer

Warnung

„XmlDictionaryWriter.Write (DateTime)“ schreibt jetzt das DateTime-Objekt als Zeichenfolge.

Sicherheit

Die folgenden Sicherheitsmodi werden in Windows Store-Anwendungen unterstützt

  1. SecurityMode

  2. SecurityMode

  3. <xref:System.ServiceModel.SecurityMode.TransportWithMessageCredentials>

  4. <xref:System.ServiceModel.SecurityMode.TransportCredentialOnly>

Die folgenden Clientanmeldeinformationstypen werden in Windows Store-Anwendungen unterstützt

  1. Keine

  2. Standard

  3. Digest

  4. Negotiate

  5. NTLM

  6. Windows

  7. Benutzername (Nachrichtensicherheit)

  8. Windows (Transportsicherheit)

Damit Windows Store-Anwendungen auf standardmäßige Windows-Anmeldeinformationen zugreifen und diese senden können, müssen Sie diese Funktionalität innerhalb der Datei „Package.appmanifest“ aktivieren. Öffnen Sie diese Datei, und wählen Sie die Registerkarte für Funktionen und dann die standardmäßigen Windows-Anmeldeinformationen aus. Dadurch kann die Anwendung eine Verbindung mit Intranetressourcen herstellen, die Domänenanmeldeinformationen erfordern.

Wichtig

Damit Windows Store-Anwendungen computerübergreifend Aufrufe ausführen können, müssen Sie eine weitere Funktion mit dem Namen „Home\/Work Networking“ aktivieren. Diese Einstellung befindet sich ebenfalls in der Datei „Package.appmanifest“ auf der Registerkarte für Funktionen. Aktivieren Sie das Kontrollkästchen „Home\/Work Networking“. Dadurch erhält die Anwendung eingehenden und ausgehenden Zugriff auf die Netzwerke der vertrauenswürdigen Orte des Benutzers wie Heim und Arbeit. Wichtige eingehende Ports sind immer blockiert. Für den Zugriff auf Internetdienste müssen Sie auch die Internetfunktion (Client) aktivieren.

Sonstiges

Die Verwendung der folgenden Klassen wird für Windows Store-Anwendungen unterstützt:

  1. ChannelFactory

  2. <xref:System.ServiceModel.DuplexChannelFactory>

  3. CallbackBehaviorAttribute

Definieren von Dienstverträgen

Es wird empfohlen, asynchrone Dienstvorgänge nur mit dem taskbasierten asynchronen Muster zu definieren. Dadurch wird sichergestellt, dass Windows Store-Anwendungen beim Aufrufen eines Dienstvorgangs reaktionsfähig bleiben.

Warnung

Obwohl keine Ausnahme ausgelöst wird, wenn Sie einen synchronen Vorgang definieren, wird dringend empfohlen, nur asynchrone Vorgänge zu definieren.

Aufrufen von WCF-Diensten aus Windows Store-Anwendungen

Wie bereits erwähnt, müssen alle Konfigurationsschritte im Code vorgenommen werden, und zwar in der GetBindingForEndpoint-Methode in der generierten Proxyklasse. Ein Dienstvorgang wird genauso aufgerufen wie eine taskbasierte asynchrone Methode. Siehe dazu den folgenden Codeausschnitt.

void async SomeMethod() { ServiceClient proxy = new ServiceClient(); Task<T> results = await proxy.CallAsync(param1, param2); T result = results.Result; if (result.Success) { // Do something with result } }  

Beachten Sie, dass für die Methode, die den asynchronen Aufruf ausführt, das async-Schlüsselwort und beim Aufrufen der asynchronen Methode das await-Schlüsselwort verwendet wird.

Siehe auch

WCF in Windows Store Apps-Blog
WCF Windows Store-Clients und Sicherheit
Windows Store-Apps und computerübergreifende Aufrufe
Aufrufen eines in Azure bereitgestellten WCF-Diensts aus einer Windows Store-App
Programmieren der WCF-Sicherheit
Bindungen