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.
Das StreamingFeeds-Beispiel veranschaulicht, wie Syndication-Feeds verwaltet werden, die eine große Anzahl von Elementen enthalten. Auf dem Server zeigt das Beispiel, wie die Erstellung einzelner SyndicationItem-Objekte innerhalb des Feeds bis unmittelbar vor den Zeitpunkt verzögert werden kann, zu dem das Element in den Netzwerkstream geschrieben wird.
Auf dem Client zeigt das Beispiel, wie ein benutzerdefinierter Syndikations-Feed-Formatierer verwendet werden kann, um einzelne Elemente aus dem Netzwerkstream zu lesen, sodass der gelesene Feed nie im Arbeitsspeicher vollständig gepuffert wird.
Um die Streamingfunktion der Syndication-API am besten zu veranschaulichen, verwendet dieses Beispiel ein etwas unwahrscheinliches Szenario, in dem der Server einen Feed verfügbar macht, der eine unendliche Anzahl von Elementen enthält. In diesem Fall generiert der Server weiterhin neue Elemente in den Feed, bis er bestimmt, dass der Client eine bestimmte Anzahl von Elementen aus dem Feed gelesen hat (standardmäßig 10). Der Einfachheit halber werden sowohl der Client als auch der Server im selben Prozess implementiert und ein freigegebenes ItemCounter
Objekt verwendet, um nachzuverfolgen, wie viele Elemente der Client erstellt hat. Der ItemCounter
Typ ist nur zum Zweck vorhanden, dass das Beispielszenario sauber beendet werden kann und kein Kernelement des gezeigten Musters ist.
Die Demonstration verwendet Visual C#-Iteratoren (mithilfe des yield return
Schlüsselwortkonstrukts). Weitere Informationen zu Iteratoren finden Sie im Thema "Verwenden von Iteratoren" auf MSDN.
Dienstleistung
Der Dienst implementiert einen grundlegenden WebGetAttribute Vertrag, der aus einem Vorgang besteht, wie im folgenden Code dargestellt.
[ServiceContract]
interface IStreamingFeedService
{
[WebGet]
[OperationContract]
Atom10FeedFormatter StreamedFeed();
}
Der Dienst implementiert diesen Vertrag mithilfe einer ItemGenerator
Klasse, um einen potenziell unendlichen Datenstrom von SyndicationItem Instanzen mit einem Iterator zu erstellen, wie im folgenden Code gezeigt.
class ItemGenerator
{
public IEnumerable<SyndicationItem> GenerateItems()
{
while (counter.GetCount() < maxItemsRead)
{
itemsReturned++;
yield return CreateNextItem();
}
}
...
}
Wenn die Dienstimplementierung den Feed erstellt, wird die Ausgabe ItemGenerator.GenerateItems()
anstelle einer gepufferten Auflistung von Elementen verwendet.
public Atom10FeedFormatter StreamedFeed()
{
SyndicationFeed feed = new SyndicationFeed("Streamed feed", "Feed to test streaming", null);
//Generate an infinite stream of items. Both the client and the service share
//a reference to the ItemCounter, which allows the sample to terminate
//execution after the client has read 10 items from the stream
ItemGenerator itemGenerator = new ItemGenerator(this.counter, 10);
feed.Items = itemGenerator.GenerateItems();
return feed.GetAtom10Formatter();
}
Infolgedessen wird der Elementstream nie vollständig im Arbeitsspeicher gepuffert. Sie können dieses Verhalten beobachten, indem Sie einen Haltepunkt für die yield return
Anweisung innerhalb der ItemGenerator.GenerateItems()
Methode festlegen und notieren, dass dieser Haltepunkt zum ersten Mal auftritt, nachdem der Dienst das Ergebnis der StreamedFeed()
Methode zurückgegeben hat.
Kunde
Der Client in diesem Beispiel verwendet eine benutzerdefinierte SyndicationFeedFormatter Implementierung, die die Materialisierung einzelner Elemente im Feed verzögert, anstatt sie in den Arbeitsspeicher zu puffern. Die benutzerdefinierte StreamedAtom10FeedFormatter
Instanz wird wie folgt verwendet.
XmlReader reader = XmlReader.Create("http://localhost:8000/Service/Feeds/StreamedFeed");
StreamedAtom10FeedFormatter formatter = new StreamedAtom10FeedFormatter(counter);
SyndicationFeed feed = formatter.ReadFrom(reader);
Normalerweise wird ein Aufruf ReadFrom(XmlReader) erst zurückgegeben, wenn der gesamte Inhalt des Feeds aus dem Netzwerk gelesen und in den Arbeitsspeicher gepuffert wurde. Das StreamedAtom10FeedFormatter
-Objekt setzt ReadItems(XmlReader, SyndicationFeed, Boolean) außer Kraft, um anstelle einer gepufferten Auflistung einen Iterator zurückzugeben, wie im folgenden Code gezeigt wird.
protected override IEnumerable<SyndicationItem> ReadItems(XmlReader reader, SyndicationFeed feed, out bool areAllItemsRead)
{
areAllItemsRead = false;
return DelayReadItems(reader, feed);
}
private IEnumerable<SyndicationItem> DelayReadItems(XmlReader reader, SyndicationFeed feed)
{
while (reader.IsStartElement("entry", "http://www.w3.org/2005/Atom"))
{
yield return this.ReadItem(reader, feed);
}
reader.ReadEndElement();
}
Daher wird jedes Element erst dann aus dem Netzwerk gelesen, wenn die Clientanwendung, die die Ergebnisse von ReadItems()
durchläuft, bereit ist, es zu verwenden. Sie können dieses Verhalten beobachten, indem Sie einen Haltepunkt bei der yield return
Anweisung innerhalb von StreamedAtom10FeedFormatter.DelayReadItems()
setzen und beachten, dass dieser Haltepunkt zum ersten Mal erreicht wird, nachdem der Aufruf von ReadFrom()
abgeschlossen ist.
Die folgenden Anweisungen zeigen, wie Sie das Beispiel erstellen und ausführen. Beachten Sie, dass der Server zwar die Generierung von Elementen stoppt, nachdem der Client 10 Elemente gelesen hat, die Ausgabe jedoch zeigt, dass der Client deutlich mehr als 10 Elemente liest. Dies liegt daran, dass die vom Beispiel verwendete Netzwerkbindung Daten in Vier-Kilobyte-Segmenten (KB) überträgt. Daher empfängt der Client 4 KB Elementdaten, bevor er die Möglichkeit hat, sogar ein Element zu lesen. Dies ist ein normales Verhalten (das Senden von gestreamten HTTP-Daten in relativ großen Segmenten erhöht die Leistung).
So können Sie das Beispiel einrichten, erstellen und ausführen
Stellen Sie sicher, dass Sie das One-Time Setup-Verfahren für die Windows Communication Foundation-Beispieleausgeführt haben.
Um die C#- oder Visual Basic .NET-Edition der Lösung zu erstellen, befolgen Sie die Anweisungen in Building the Windows Communication Foundation Samples.
Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.