Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Die WCF Data Services 5.0-Clientbibliothek für Silverlight wird in Windows Phone-Anwendungen nicht unterstützt.Sie müssen stattdessen die OData-Clientbibliothek für Windows Phone verwenden, die im Windows Phone 7.1 SDK enthalten ist.Weitere Informationen finden Sie unter Open Data Protocol (OData) Overview for Windows Phone.Derzeit gibt es keine Clientbibliothek für Windows Phone, die OData v3 unterstützt.
Die WCF Data Services-Clientbibliothek für Silverlight erzeugt HTTP-Anforderungen an einen Datendienst, der Version 3 des OData Protokolls unterstützt, und wandelt die Daten im OData-Antwortfeed auf dem Client in Objekte um. Die beiden Hauptklassen der Clientbibliothek sind die DataServiceContext-Klasse und die DataServiceQuery<TElement>-Klasse. Die DataServiceContext-Klasse kapselt Vorgänge, die für einen angegebenen Datendienst ausgeführt werden. OData-basierte Dienste sind zustandslos. DataServiceContext behält jedoch den Zustand von Entitäten auf dem Client zwischen Interaktionen mit dem Datendienst bei. Auf diese Weise können vom Client Funktionen wie Änderungsnachverfolgung und Identitätsverwaltung unterstützt werden. Die DataServiceQuery<TElement>-Klasse stellt eine Abfrage für eine bestimmte Entitätenmenge dar. Weitere Informationen finden Sie unter Verwenden eines Datendiensts in einer .NET Framework-Anwendung (WCF Data Services). Eine Beispielanwendung, die einen Feed des Northwind-Beispieldatendiensts verwendet, finden Sie unter WCF Data Services-Schnellstart für Silverlight
Hinweis
Beim Verwenden der WCF Data Services-Clientbibliothek für Silverlight werden alle Anforderungen an den Dienst synchron durchgeführt.Weitere Informationen finden Sie unter Asynchrone Vorgänge (WCF Data Services).
Dieses Thema enthält folgende Abschnitte:
Generieren von Clientdatendienstklassen
Sie können über das Dialogfeld Dienstverweis hinzufügen in Visual Studio einen Verweis auf einen beliebigen Dienst hinzufügen, der einen OData-Feed zur Verfügung stellt. Weitere Informationen finden Sie unter Generieren der Clientdatendienstklassen (WCF Data Services). Die Clientdatendienstklassen können auch an der Eingabeaufforderung mit dem Tool DataSvcUtil.exe generiert werden. Weitere Informationen finden Sie unter Gewusst wie: Manuelles Generieren von Clientdatendienstklassen (WCF Data Services).
Hinweis
Wenn WCF Data Services, Version 5.0, installiert wird, fügt das Tool "Dienstverweis hinzufügen", automatisch einen Verweis auf die Microsoft.Data.Services.Client.SL.dll-Version der Clientbibliothek hinzu, statt einen Verweis auf die System.Data.Services.Client.dll-Version hinzuzufügen, die in Silverlight enthalten ist.Wenn Sie aus irgendwelchen Gründen die vorherige Version des Silverlight-Clients verwenden müssen, sollten Sie manuell einen Verweis auf die Silverlight-Version der Clientbibliothek hinzufügen.Weitere Informationen finden Sie unter Gewusst wie: Manuelles Generieren von Clientdatendienstklassen (WCF Data Services).
Zugreifen auf und Ändern von Ressourcen
In einer Silverlight-basierten Anwendung sind alle Vorgänge für einen Datendienst synchron. Sie können asynchrone Vorgänge mit einem Paar von Methoden für die DataServiceContext-Klasse und die DataServiceQuery<TElement>-Klasse ausführen, die mit Begin bzw. End beginnen. Die Begin-Methoden registrieren einen Delegaten, den der Dienst aufruft, wenn der Vorgang abgeschlossen ist. Die End-Methoden sollten im Delegaten aufgerufen werden, der zum Behandeln des Rückrufs von den abgeschlossenen Vorgängen registriert ist. Wenn Sie die End-Methode aufrufen, um einen asynchronen Vorgang abzuschließen, muss der Aufruf in derselben DataServiceQuery<TElement>-Instanz oder DataServiceContext-Instanz erfolgen, in der der Vorgang begonnen wurde. Jede Begin-Methode akzeptiert einen state-Parameter, der ein Zustandsobjekt an den Rückruf übergeben kann. Dieses Zustandsobjekt wird als das IAsyncResult abgerufen, das mit dem Rückruf angegeben wird, und wird zum Aufrufen der entsprechenden End-Methode zum Abschließen des asynchronen Vorgangs verwendet. Wenn Sie beispielsweise die DataServiceQuery<TElement>-Instanz als state-Parameter beim Aufrufen der BeginExecute-Methode für die Instanz angeben, wird die gleiche DataServiceQuery<TElement>-Instanz als IAsyncResult zurückgegeben. Diese Instanz von DataServiceQuery<TElement> wird anschließend verwendet, um die EndExecute-Methode zum Abschließen des Abfragevorgangs aufzurufen. Weitere Informationen finden Sie unter Asynchrone Vorgänge (WCF Data Services).
Da die WCF Data Services-Clientbibliothek für Silverlight asynchron mithilfe von Netzwerkprotokollen auf den Datendienst zugreift, müssen Sie die BeginInvoke-Method der Dispatcher-Klasse verwenden, um den Antwortvorgang korrekt zurück an den Hauptanwendungsthread (den UI-Thread) der Silverlight-basierten Anwendung zu marshallen. Weitere Informationen finden Sie unter Synchronizing Data for Multithreading.
Abfragen von Ressourcen
Die WCF Data Services-Clientbibliothek für Silverlight ermöglicht es Ihnen, Abfragen für einen OData-Datendienst mit vertrauten .NET Framework-Programmierschemas auszuführen, u. a. mithilfe von Language Integrated Query (LINQ). Wenn die BeginExecute-Methode von DataServiceQuery<TElement> oder DataServiceContext aufgerufen wird, übersetzt die Clientbibliothek eine Abfrage oder einen Uniform Resource Identifier (URI) in eine HTTP GET-Anforderungsnachricht. Die Clientbibliothek empfängt die zugehörige Antwortnachricht und übersetzt sie in Instanzen von Clientdatendienstklassen. Diese Klassen werden vom DataServiceContext verfolgt, zu dem DataServiceQuery<TElement> gehört. Weitere Informationen finden Sie unter Gewusst wie: Ausführen von asynchronen Datendienstabfragen (WCF Data Services).
In einigen Szenarien ist es hilfreich zu wissen, wie viele Entitäten in einer Entitätenmenge insgesamt enthalten sind, statt nur die von der Abfrage zurückgegebene Anzahl im Feed zu kennen. Rufen Sie die IncludeTotalCount-Methode für DataServiceQuery<TElement> auf, um anzufordern, dass die Gesamtanzahl von Entitäten dieser Entitätenmenge in das Abfrageergebnis aufgenommen wird. In diesem Fall gibt die TotalCount-Eigenschaft der zurückgegebenen QueryOperationResponse<T>-Instanz die Gesamtzahl der in der Menge enthaltenen Entitäten zurück. Sie können auch die AddQueryOption-Methode verwenden, um einer Abfrage andere von OData unterstützte Abfrageoptionen hinzufügen. Weitere Informationen finden Sie unter Abfragen des Datendiensts (WCF Data Services).
LINQ-Abfragen
Da die DataServiceQuery<TElement>-Klasse die von LINQ definierte IQueryable<T>-Schnittstelle implementiert, kann die WCF Data Services-Clientbibliothek für Silverlight LINQ-Abfragen für Entitätenmengendaten in einen URI umwandeln, der einen für eine Datendienstressource ausgewerteten Abfrageausdruck darstellt. Die folgende LINQ-Abfrage gibt z. B. einen Feed zurück, bei dem es sich um eine Auflistung von Order-Entitäten handelt, die mit dem CustomerID-Eigenschaftswert gefiltert werden, der vom Benutzer im Textfeld customerId angegeben wird.
' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
Where orderByCustomer.Customer.CustomerID = _
Me.customerId.Text _
Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
where orderByCustomer.Customer.CustomerID == this.customerId.Text
select orderByCustomer;
Laden von verzögertem Inhalt
Standardmäßig schränkt WCF Data Services die Datenmenge ein, die eine Abfrage zurückgibt. Sie können jedoch explizit weitere Daten aus dem Datendienst laden, einschließlich verknüpfter Entitäten, ausgelagerter Antwortdaten und binärer Datenströme, wenn sie benötigt werden. Beim Ausführen einer Abfrage werden nur Entitäten in der behandelten Entitätenmenge zurückgegeben. Wenn beispielsweise eine Abfrage des Northwind-Datendiensts Customers-Entitäten zurückgibt, werden die verknüpften Orders-Entitäten standardmäßig nicht zurückgegeben, obwohl eine Beziehung zwischen Customers und Orders besteht. Zugehörige Entitäten können mit der ursprünglichen Abfrage (unverzügliches Laden) oder jeweils pro Entität (explizites Laden) geladen werden. Weitere Informationen finden Sie unter Laden von verzögertem Inhalt (WCF Data Services). Wenn der Silverlight-Client und DataServiceCollection<T> verwendet werden, können Sie Auflistungen der zugehörigen Entitäten aus einer Navigationseigenschaft laden, indem Sie LoadAsync aufrufen.
Tipp
Beachten Sie beim Auswählen eines Schemas für das Laden von zugehörigen Entitäten das Leistungsverhalten, das durch die Nachrichtengröße und die Anzahl der Abfragen an den Datendienst beeinflusst wird.
Wenn Paging im Datendienst aktiviert ist, müssen Sie explizit nachfolgende Datenseiten aus dem Dienst laden, wenn die Anzahl der zurückgegebenen Entitäten die Paginggrenze überschreitet. Da nicht im Voraus festgestellt werden kann, ob und wann Paging auftritt, empfiehlt es sich, die Silverlight-Anwendung so zu gestalten, dass sie einen seitenweise zurückgegebenen OData-Feed korrekt verarbeiten kann. Beispiele zur korrekten Verarbeitung von seitenweise zurückgegebenen Antworten finden Sie unter Vorgehensweise: Binden von Datendienstdaten an Steuerelemente (Silverlight-Client) und Abfragen des Datendiensts (WCF Data Services).
Abfrageprojektion
Die Projektion stellt einen Mechanismus bereit, mit dem sich die von einer Abfrage zurückgegebene Datenmenge im OData-Feed reduzieren lässt, indem angegeben wird, dass nur bestimmte Eigenschaften einer Entität in der Antwort zurückgegeben werden sollen. Weitere Informationen finden Sie unter OData: Select System Query Option ($select). Sie können einer LINQ-Abfrage mit der select-Klausel (Select in Visual Basic) eine Projektionsklausel hinzufügen. Zurückgegebene Entitätsdaten können auf dem Client entweder in Entitätstypen oder in Nicht-Entitätstypen projiziert werden. Änderungen an Nicht-Entitätstypen können nicht im Datendienst gespeichert werden. Die folgende LINQ-Abfrage projiziert z. B. Customer-Daten in einen neuen CustomerAddress-Entitätstyp auf dem Client.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddress With
{.CustomerID = c.CustomerID, _
.Address = c.Address, _
.City = c.City, _
.PostalCode = c.PostalCode, _
.Country = c.Country _
}
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddress
{
CustomerID = c.CustomerID,
Address = c.Address,
City = c.City,
PostalCode = c.PostalCode,
Country = c.Country
};
Wichtig
Im Datendienst können Datenverluste auftreten, wenn Sie Updates speichern, die an projizierten Typen vorgenommen wurden.Weitere Informationen zu finden Sie unter Projection Considerations in der WCF Data Services-Clientdokumentation.
Weitere Informationen finden Sie unter Vorgehensweise: Projizieren von Abfrageergebnissen des Datendiensts (Silverlight-Client).
Bearbeiten von Ressourcen und Speichern von Änderungen
Der Client verfolgt Änderungen an Entitäten nach, die durch Ausführen der folgenden Methoden von DataServiceContext manuell gemeldet werden können:
Mithilfe dieser Methoden kann der Client hinzugefügte und gelöschte Entitäten sowie Änderungen an den Eigenschaftswerten oder an Beziehungen zwischen Entitätsinstanzen verfolgen. Wenn Sie das Dialogfeld Dienstverweis hinzufügen zum Generieren der Clientdatendienstklassen verwenden, wird für jede Entität in der generierten DataServiceContext-Klasse zusätzlich eine AddTo-Methode erstellt. Mit diesen Methoden können Sie einem Entitätssatz eine neue Entitätsinstanz hinzufügen und die Hinzufügung an den Kontext zurückmelden. Wenn Sie die BeginSaveChanges-Methode und die EndSaveChanges-Methode aufrufen, werden diese nachverfolgten Änderungen asynchron an den Datendienst zurückgesendet.
Wenn Sie entweder mit der AddObject-Methode oder der entsprechenden AddTo-Methode eine neue Entität hinzufügen, werden Beziehungen zwischen der neuen Entität und verknüpften Entitäten nicht automatisch definiert. Sie können Beziehungen zwischen Entitätsinstanzen erstellen und ändern und die Clientbibliothek diese Änderungen im Datendienst widerspiegeln lassen. Beziehungen zwischen Entitäten werden im Modell als Zuordnungen definiert, und das DataServiceContext-Objekt verfolgt jede Beziehung als Linkobjekt im Kontext. WCF Data Services stellt die folgenden Methoden für die DataServiceContext-Klasse zum Erstellen, Ändern und Löschen dieser Links bereit:
Weitere Informationen finden Sie unter Updating the Data Service (WCF Data Services)
Arbeiten mit Binärdaten
OData definiert einen Mechanismus für einen Zugriff auf Binärdaten, der getrennt von der Entität erfolgen kann, zu der die Daten gehören. Auf diese Weise kann ein OData-Dienst große Binärdaten als Medienressource verfügbar machen, die zu einem Medienlinkeintrag gehören. Der WCF Data Services Client für Silverlight kann eine Medienressource von einem OData-Dienst als binären Datenstrom verarbeiten. Um auf den binären Datenstrom zuzugreifen, rufen Sie die BeginGetReadStream-Methode für die DataServiceContext-Instanz auf, die die Entität nachverfolgt, die den Medienlinkeintrag darstellt. Diese asynchrone Methode gibt ein DataServiceStreamResponse-Objekt zurück, wenn die EndGetReadStream-Methode der DataServiceContext-Instanz aufgerufen wird, die vom Rückruf zurückgegeben wurde. Analog wird eine Medienressource an den OData-Dienst gesendet, wenn Sie die SetSaveStream-Methode aufrufen, nachdem die BeginSaveChanges-Methode und die EndSaveChanges-Methode aufgerufen wurden. Weitere Informationen finden Sie unter Vorgehensweise: Zugreifen auf Binärdaten als Datenstrom (Silverlight-Client).
Datenbindung
Der WCF Data Services-Client für Silverlight unterstützt das Binden von Daten an Steuerelemente mithilfe der DataServiceCollection<T>-Klasse. Diese Klasse, die von ObservableCollection<T> erbt, stellt eine dynamische Datenauflistung dar, die Benachrichtigungen bereitstellt, wenn Elemente in der Auflistung hinzugefügt oder entfernt werden. Anhand dieser Benachrichtigungen kann der DataServiceContext Änderungen automatisch nachverfolgen, ohne dass die Methoden für die Änderungsnachverfolgung explizit aufgerufen werden müssen. Eine DataServiceCollection<T> wird basierend auf einer DataServiceQuery<TElement> definiert. Sobald diese Abfrage ausgeführt wird, stellt sie die Objekte für die Auflistung bereit.
Mit der LoadAsync-Methode kann die Abfrage asynchron ausgeführt werden, um die Ergebnisse in die Auflistung zu laden. Bei dieser Methode ist sichergestellt, dass die Ergebnisse an den richtigen Thread gemarshallt werden, sodass Sie keinen Dispatcher verwenden müssen. Wenn Sie eine Instanz von DataServiceCollection<T> für die Datenbindung verwenden, stellt der Client sicher, dass vom DataServiceContext verfolgte Objekte mit den Daten im gebundenen Benutzeroberflächenelement synchron bleiben. Sie müssen Änderungen in Entitäten einer Bindungsauflistung nicht manuell an den DataServiceContext melden. Weitere Informationen finden Sie unter Vorgehensweise: Binden von Datendienstdaten an Steuerelemente (Silverlight-Client).
Domänenübergreifende Ausführung
In Silverlight können Sie auf Dienste zugreifen, die in einer separaten Domäne gehostet werden. Diese Art des Zugriffs muss explizit aktiviert werden, indem eine domänenübergreifende Richtliniendatei auf dem Server bereitgestellt wird. Diese Funktionalität ist in der HTTP-Implementierung des Silverlight-Clients enthalten.
Hinweis
Es müssen einige wichtige Sicherheitsaspekte beachtet werden, bevor Sie Silverlight-Clients gestatten, domänenübergreifend auf Webdienste zuzugreifen.Weitere Informationen finden Sie unter HTTP Communication and Security with Silverlight.
Für die meisten Anforderungen an einen Datendienst verwendet der WCF Data Services-Client für Silverlight eine XMLHTTP-Implementierung. Wenn der WCF Data Services-Client jedoch eine domänenübergreifende Anforderung feststellt, wechselt er automatisch zur Verwendung der HTTP-Implementierung des Silverlight-Clients.
Hinweis
Der Client wechselt die HTTP-Implementierung nur dann automatisch, wenn die HttpStack-Eigenschaft auf Auto festgelegt ist.
Ein Beispiel für eine Datendienstkonfiguration, die domänenübergreifende Anforderungen von einer Silverlight-basierten Anwendung gestattet, finden Sie im Artikel Using the ADO.NET Data Services Silverlight Client in X-Domain and Out-of-Browser Scenarios. Die Unterstützung für domänenübergreifende Ausführung ist neu in Silverlight 4.
Out-of-Browser-Ausführung
Sie können Silverlight-basierte Anwendungen so konfigurieren, dass Benutzer diese von der Host-Webseite installieren und außerhalb des Browsers ausführen können. Der WCF Data Services-Client für Silverlight unterstützt die Out-of-Browser-Ausführung. Wenn der WCF Data Services-Client feststellt, dass eine Anwendung außerhalb des Browsers ausgeführt wird, wechselt er automatisch zur Verwendung der HTTP-Implementierung des Silverlight-Clients. Dieses Verhalten entspricht dem der domänenübergreifenden Ausführung, es wird jedoch keine domänenübergreifende Richtliniendatei benötigt. Weitere Informationen finden Sie unter Out-of-Browser Support.
Clientauthentifizierung
Standardmäßig verwendet der WCF Data Services-Client für Silverlight Anforderungen an den Datendienst die Anmeldeinformationen des Webbrowsers, und die Authentifizierung wird vom Webbrowser verwaltet. Wenn der Zugriff auf den Datendienst jedoch eine domänenübergreifende Anforderung erfordert oder die Silverlight-Anwendung außerhalb des Browsers ausgeführt wird, haben Sie die Möglichkeit, die für die Abfrage zu verwendenden Anmeldeinformationen anzugeben. Bei diesen Szenarios verwendet der Client automatisch die HTTP-Implementierung des Silverlight-Clients für Anforderungen und verwendet Standardanmeldeinformationen für die Authentifizierung. Wenn die UseDefaultCredentials-Eigenschaft auf false festgelegt ist, verwendet der Client für die Authentifizierung beim Datendienst stattdessen die ICredentials, die der Credentials-Eigenschaft zugewiesen ist.
Warnung
Benutzeranmeldeinformationen sollten nur während der Ausführung angefordert und nicht zwischengespeichert werden.Anmeldeinformationen müssen immer sicher gespeichert werden.
Sie können Anmeldeinformationen auch bereitstellen, indem Sie festlegen, dass die Anwendung die HTTP-Implementierung des Silverlight-Clients verwenden soll. Hierzu legen Sie den Wert der HttpStack-Eigenschaft auf ClientHttp fest. Im folgenden Code wird sichergestellt, dass die Anmeldeinformationen, die während der Ausführung vom Benutzer erfragt wurden, für den Zugriff auf den Datendienst verwendet werden:
' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials =
new NetworkCredential(userName, password, domain);
Wenn die HTTP-Implementierung des Silverlight-Clients nicht verwendet wird, führt das Festlegen der UseDefaultCredentials-Eigenschaft auf den Wert false bei der Ausführung zu einer Ausnahme. Wenn UseDefaultCredentials den Wert true hat, werden die Standardanmeldeinformationen verwendet, unabhängig davon, ob die Credentials-Eigenschaft festgelegt ist oder nicht.
Warnung
Mittels Standard- und Digestauthentifizierung gesendete Daten sind nicht verschlüsselt und daher für Angreifer sichtbar.Anmeldeinformationen für die Standardauthentifizierung (Benutzername und Kennwort) werden zudem in Klartext gesendet und können abgefangen werden.
Weitere Informationen finden Sie unter Vorgehensweise: Angeben von Clientanmeldeinformationen für eine Datendienstanforderung (Silverlight-Client). Ein Beispiel für einen Datendienstzugriff, bei dem die ASP.NET-Formularauthentifizierung in einer Silverlight-basierten Anwendung verwendet wird, finden Sie im Artikel Using the ADO.NET Data Services Silverlight Client Library in X-Domain and Out-of-Browser Scenarios – II (Forms Authentication).