Dienstag, 17. Januar 2012
Große Datenvolumen über WebService
Mal angenommen, man muss große Datenmenge an WebService übergeben, z.B, Liste von Postleitzahlen aus 30000 Elementen

Ein Versuch Array dem Webservice zu übergeben verursacht Fehler 400. Anfrage ist nicht akzeptiert.

Die Ursache: unser Array wird in Text-String umgewandelt. Und die Länge von diesem Text-String ist nicht unendlich.

Beschränken wir Array auf 500 Elementen, werden die Daten erfolgreich übergeben.

D.h. man könnte die länge Array's einfach schneiden und einzelne Schnitte übergeben.

Im jeden Schnitt wird dann einzelne Elemente übergeben:

// go each element of array of lists of HTTP data and call a webfunction
foreach (List ls in ArrayOfListOfZipCodes)
{
sbll = new ServiceBIZ();
sbll.GetCountOfInterestingByZipCompleted += new GetCountOfInterestingByZipCompletedEventHandler(MainControl_GetCountOfInterestingByZipCompleted);
sbll.GetCountOfInterestingByZipAsync(ls.ToArray());
}

In Call Back kummulieren wir die Ergebnisse

private void MainControl_GetCountOfInterestingByZipCompleted(object sender, GetCountOfInterestingByZipCompletedEventArgs e)
{

if (!e.Cancelled)
{
// Update the UI
iCountResult = iCountResult + e.GetCountOfInterestingByZipResult;
lblInteres.Text = iCountResult.ToString();
}

}

Wichtig ist, dass für jeden Schnitt eine neue Instanz von Proxy-Classe erstellt werden muss. Sonst bekommen wir einen Fehler in CallBack, weil die Funktion noch besetzt ist.

Für WebService sieht das Ganze so aus, als ob ihn mehrere Clients aufrufen würden.

In CallBack Funktion muss wäre es noch sinnvoll den Zugriff zu den Contorls zu synchronisieren.