Freigeben über


Beispiel für Push-Streaming

Windows Communication Foundation (WCF) verfügt über unterschiedliche Modelle für die Verarbeitung von Streamingdaten. WCF implementiert ein Pull-Modell, in dem der Anwendungscode (der Dienst) eine Instanz von Stream zurückgibt und die Infrastruktur der niedrigeren Ebene verwendet, um Daten aus diesem Stream abzurufen und in das Netzwerk zu schreiben. ASP.NET verwendet ein Push-Modell: die Infrastruktur erstellt den Ausgabestream und macht ihn unter Verwendung der OutputStream-Eigenschaft für den Anwendungscode (den IHttpHandler) verfügbar. Der Anwendungscode ist verantwortlich dafür, dass Daten in den Stream geschrieben werden. Beide Modelle sind gültige Ansätze, und es ist üblich, die beiden Methoden auf gewisse Weise zu überbrücken.

Tipp

Zum Erstellen und Ausführen dieses Beispiels muss .NET Framework, Version 3.5 installiert sein. Zum Öffnen des Projekts und der Projektmappendateien ist Visual Studio 2008 erforderlich.

Dieses Beispiel veranschaulicht, wie Streaming unter Verwendung von ASP.NET-Szenarios mit dem Webprogrammiermodell behandelt wird.

Dienst

Der Dienst implementiert zwei Vorgänge, die allgemeine ASP.NET-Szenarios illustrieren, wie im folgenden Code gezeigt.

[OperationContract]
        [WebGet(UriTemplate = "images")]
        public Message GetDynamicImage()
        {
            string text = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["text"];

            Bitmap theBitmap = GenerateImage(text);

            Message response = StreamMessageHelper.CreateMessage(MessageVersion.None, "", "image/jpeg",
                delegate(Stream outputStream)
                {
                    theBitmap.Save(outputStream, ImageFormat.Jpeg);
                });

            return response;
        }

Beachten Sie, dass die GetDynamicImage()-Methode Message zurückgibt und nicht Stream. Eine benutzerdefinierte Implementierung von BodyWriter (DelegateBodyWriter) wird verwendet, um die Push-Streamingsemantik zu implementieren.

DelegateBodyWriter übernimmt einen Delegatparameter, der den Ausgabestream als Eingabe übernimmt.

public delegate void StreamWriterDelegate(Stream output);

class DelegateBodyWriter : BodyWriter
    {
        StreamWriterDelegate writer;

        public DelegateBodyWriter(StreamWriterDelegate writer)
            : base(false)
        {
            this.writer = writer;
        }

        protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
        {
            writer.WriteStartElement("Binary");

            XmlWriterStream stream = new XmlWriterStream(writer);
            this.writer(stream);
            stream.Close();

            writer.WriteEndElement();
        }
    }

Der StreamWriterDelegate-Delegat wird dann während der Ausführung von RawStreamResponseMessage.OnWriteBodyContents() aufgerufen.

Die XmlWriterStream-Klasse ist ein Adapter, der über den XmlDictionaryWriter eine Stream-API bereitstellt, die von der Message-Klasse verwendet wird.

Sie können die Ausgabe des Beispiels in einem Webbrowser anzeigen. Um mit dem Beispiel zu interagieren, navigieren Sie zu den folgenden URLs, während der Dienst ausgeführt wird.

https://localhost:8000/images?text=Hello, world!

https://localhost:8000/text?text=Hello, world!

So richten Sie das Beispiel ein, erstellen es und führen es aus

  1. Vergewissern Sie sich, dass Sie Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Zum Erstellen der C#- oder Visual Basic .NET-Edition der Projektmappe befolgen Sie die unter Erstellen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem einzigen Computer oder computerübergreifend ausführen möchten, befolgen Sie die unter Durchführen der Windows Communication Foundation-Beispiele aufgeführten Anweisungen.

Siehe auch

Aufgaben

Beispiel zum Streaming von Feeds

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.