Freigeben über


Batchanforderungen (WCF Data Services)

Im WCF Data Services-Framework kann der Client eines Datendiensts mithilfe von Batchanforderungen eine Gruppe von Vorgängen zusammenstellen und diese als einzelne HTTP-Anforderung an den Datendienst senden.Dadurch wird bei Anwendungen, die zahlreiche Anforderungen senden, die Anzahl der Roundtrips zum Datendienst verringert.

Zu den grundlegenden Konzepte für den Inhalt von einem Batch, einem Changeset und einem Abfragevorgang zählen unter anderem:

  • Ein Batch ist ein Container für Vorgänge.

    • Ein Batch besteht aus Gruppen von Erstell-, Aktualisierungs- und Löschvorgängen (CUD – Create, Update, Delete), die als Changesets bezeichnet werden, sowie Abfragevorgängen.

    • Ein WCF Data Services ist erforderlich, um die Vorgänge in einem Batch beginnend mit dem ersten Changeset bzw. ersten Abfragevorgang sequenziell bis zum letzten Changesetz bzw. Abfragevorgang zu verarbeiten.

  • Ein Changeset ist eine Gruppe mit mindestens einem CUD-Vorgang.

  • Für den Datendienst bestehen keine Anforderungen hinsichtlich der Reihenfolge von Vorgängen in einem Changeset.Changesetknoten müssen in der Reihenfolge verarbeitet werden, in der sie innerhalb des übergeordneten Batchknotens angezeigt werden.

  • Alle Vorgänge im Changeset müssen einzeln oder atomar angewendet werden.

    • Atomar bedeutet hierbei, dass alle oder keiner der Vorgänge in einem Changeset erfolgreich sind.Die beim Fehlschlagen eines Vorgangs verwendete Isolation von Vorgängen und die Rollbacksemantik können den Anforderungen des jeweiligen Diensts entsprechend implementiert werden.
  • Ein Abfragevorgang ist ein innerhalb eines Batchs angegebener Abrufvorgang.Abfragevorgänge verwenden method=GET und entsprechen semantisch einer einzelnen GET-Anforderung, die außerhalb des Batchs ausgeführt wird – mit dem offensichtlichen Unterschied, dass viele GET-Anforderungen in einer einzelnen HTTP-Anforderung gesendet werden können, die wiederum viele method=GET-Knoten für Vorgänge unter dem Batch enthalten.

Batchantwort

Wenn der Batch vom Server akzeptiert und verstanden wird, ist die Antwort auf eine Batchanforderung immer der Rückgabecode 202 Accepted.Antworten auf die einzelnen Vorgänge innerhalb eines Batchs werden innerhalb der Nutzlast eines Batchs im Antwortelement zurückgegeben.Konzeptionell liegt zwischen der Antwort eines Batchs und der Anforderung eine 1:1-Entsprechung vor, außer wenn ein Vorgang innerhalb eines Changesets fehlschlägt.In diesem Fall wird nur eine einzige Antwort für das Changeset zurückgegeben, da die Vorgänge eines Changesets atomar sind.

Allgemeine Regeln:

  • Wenn alle Vorgänge in einem Changeset erfolgreich sind, wird eine Antwort für jeden Vorgang innerhalb des Changesets zurückgegeben.Wenn ein Vorgang im Changeset fehlschlägt, wird nur ein einziges Antwortobjekt zurückgegeben, das die einzelne Antwort für alle Vorgänge im Changeset darstellt.

  • HTTP-eTags werden mit den gleichen Mechanismen wie in der Erweiterungsspezifikation Vollständige Parallelität definiert an das Kernprotokoll übertragen. Dabei fungiert das Antwortelement als HTTP-Antwortheader für einen angegebenen Vorgang.

Batchadresse

Das Adressierungsschema für den Batchendpunkt für einen bestimmten Dienst wird durch die folgenden Spezifikationen beschrieben.

  • Wenn der Datendienst die Batchverarbeitung unterstützt, muss er einen $batch-Endpunkt bereitstellen, der Batchanforderungen unterstützt, beispielsweise http://northwindtraders.com/dataservice.svc/$batch.

  • Der Endpunkt muss verfügbar sein, wenn das URI-Segment /$batch ausschließlich in Kleinbuchstaben angegeben wird.Ein Dienst kann für das $batch-Segment alternierende Schemas für die Groß-/Kleinschreibung implementieren.

  • In einer Anforderung an einen Batchendpunkt sind keine WCF Data Services-Abfragevorgänge zulässig, die mit dem Zeichen $ beginnen, z. B. $filter.+Das Vorhandensein solcher Operatoren löst eine Antwort vom Typ "400 Bad Request" aus.

    • Nicht -WCF Data Services-Abfrageoptionen, z. B. ?MyCustomOp=dat, sind zulässig.
  • Nach dem Segment, in dem das $batch-Segment enthalten ist, sind keine weiteren Pfadsegmente zulässig (ein einzelnes abschließendes / ist zulässig).Der Einschluss solcher Pfadsegmente führt zu einem Antwortcode vom Typ "404 Resource Not Found".

Die folgenden Beispiele zeigen eine einwandfreie URI-Syntax für den Batch:

http://northwindtraders.com/dataservice.svc/$batch

http://northwindtraders.com/dataservice.svc/$batch?Func1=processA\&Func2=processB

Batchanforderungen

Die folgenden Spezifikationen beschreiben das Erstellen und Senden einer Batchanforderung an einen Datendienst.

  • Bei allen Anforderungen an den $batch-URI muss das POST-Verb verwendet werden.Jede Anforderung an den $batch-URI, bei der ein anderes Verb als POST verwendet wird, führt zu einem Antwortcode vom Typ "405 Method Not Supported". Dabei ist der Antworttext leer, und der entsprechende HTTP-Header zeigt an, dass ausschließlich das POST-Verb für den $batch-Endpunkt zulässig ist.

  • Eine Anforderung an den $batch-URI MUSS u. a. die folgenden HTTP-Header enthalten:

    • MIME-Version: 1.0

    • Content-Type: multipart/mixed; boundary=batch_<GUID>

    • GUID = any GUID value.Das empfohlene Format ist a9e525ad-9810-4e4c-807e-ec961248d88d, damit die Grenze nicht in den Daten eines der MIME-Teile auftritt.

  • Jedes Changeset und/oder jeder Abfragevorgang in einer Batchanforderung wird als separater MIME-Teil dargestellt, getrennt durch die GUID-Grenze des Batchs.

  • Jedes Changeset wird als geschachteltes mehrteiliges oder gemischtes Dokument innerhalb von GUID-Grenzen des Batchs der oben genannten Regel entsprechend dargestellt.Der folgende Header muss im MIME-Stammteil des Changesets vorhanden sein: Content-Type: multipart/mixed; boundary=changeset_<GUID>

  • Vor- und Nachspann in den MIME-Teilen sind zulässig, werden jedoch ignoriert.

  • Jeder MIME-Teil, der einen Vorgang (CUD oder Abfrage) darstellt, muss die folgenden MIME-Header enthalten:

    • Content-Type: application/http;version=1.1

    • Content-Transfer-Encoding: binary

  • Jeder MIME-Teil, der einen Vorgang (CUD oder Abfrage) darstellt, muss eine HTTP-Anforderung als Text des MIME-Teils enthalten, genau so, als ob es sich bei der Anforderung um eine eigenständige HTTP-Anforderung handelt.Teilcodierung wird nicht unterstützt.

  • Folgendes ist beim Text eines MIME-Teils zu beachten, der einen Vorgang (CUD oder Abfrage) darstellt:

    • Er sollte keine authentifizierungsbezogenen HTTP-Header enthalten, da die für die Authentifizierung verwendete Infrastruktur solche Header wahrscheinlich nicht analysiert und verwendet.Solche Header werden in diesem Kontext von WCF Data Services ignoriert.

    • Er sollte keinen Expect-Header beinhalten, da dessen Inhalt ignoriert wird.

    • Er sollte keinen From-Header beinhalten, da dessen Inhalt ignoriert wird.

    • Er sollte keinen Range- oder If-Range-Header beinhalten, da dessen Inhalte ignoriert werden.

    • Er sollte keinen TE-Header beinhalten, da dessen Inhalte ignoriert werden.

  • Anforderungen an Dienstvorgänge auf dem Server, die mit [WebGet] versehen sind und mittels GET-Anforderung aufrufbar sind, können als Teil eines Abfragevorgangs aufgerufen werden.

  • Anforderungen an Dienstvorgänge, die mit [WebInvoke] versehen sind und mittels PUT-, POST- oder DELETE-Anforderung aufrufbar sind, können als Teil eines Vorgangs in einem Changeset aufgerufen werden.

Verknüpfen von Vorgängen in einem Changeset

Um das Verweisen auf eine neu erstellte Entität zu ermöglichen, die servergenerierte Schlüssel in einem Changeset verwendet, wie z. B. das Ergebnis eines Einfügevorgangs, wird ein Mechanismus zur Anforderungsverknüpfung definiert, sodass sich nachfolgende Vorgänge an die eingefügte Entität richten können.In WCF Data Services ist jedem MIME-Teil, der einen Vorgang in einem Changeset oder einen Abfragevorgang darstellt, implizit eine Nummer zugeordnet. Der erste MIME-Teil, ausgenommen Vor- und Nachspann, trägt die Nummer 0 und der letzte Teil die Nummer N-1. Dabei entspricht N der Anzahl der MIME-Teile in der Batchanforderung.

Nachfolgende Vorgänge in einer Batchanforderung können auf die neu erstellte Entität verweisen, indem $[MimePartIndex#] statt eines URI angegeben wird, der auf die neue Ressource verweist.

Batchantworten

In der folgenden Liste sind die allgemeinen Regeln für Batchantworten aufgeführt:

  • Wenn der äußere Satz an HTTP-Headern eine gültige Batchanforderung darstellt, wird der Antwortcode "202 Accepted" zurückgegeben, der besagt: "Die Anforderung wurde zur Bearbeitung angenommen, die Verarbeitung wurde jedoch noch nicht abgeschlossen.Die Anforderung wird nicht zwingend behandelt, da dies möglicherweise bei der eigentlichen Verarbeitung verhindert wird", wie unter RFC 2616 (in englischer Sprache) explizit spezifiziert.

  • Wenn der äußere Satz an HTTP-Headern keine gültige Batchanforderung darstellt, wird die Antwort "400 Bad Request" zurückgegeben.

  • Wenn ein X-HTTP-Methodenheader bereitgestellt wird, der eine alternative HTTP-Anforderungsmethode angibt, wird die Antwort "400 Bad Request" zurückgegeben.

  • Wenn eine Anforderung eine andere Methode als POST enthält, wird die Antwort "405 Method Not Allowed" zurückgegeben.

  • Antworten weisen immer den Typ multipart/mixed auf.

  • Wenn alle Vorgänge in einem Changeset innerhalb eines Batchs erfolgreich sind, wird für jeden Vorgang innerhalb des Changesets ein MIME-Teil zurückgegeben.Wenn ein Vorgang im Changeset fehlschlägt, ist nur ein MIME-Teil in der Antwort enthalten, der die Antwort für alle Vorgänge im Changeset darstellt.Dieser Ansatz wird verwendet, da alle Vorgänge im Changeset einzeln verarbeitet werden. Vorgänge dieser Sorte werden als atomar bezeichnet.

Siehe auch

Weitere Ressourcen

ADO.NET Data Service-Spezifikationen