Dela via


Stream

Stream-exemplet visar användningen av kommunikation i direktuppspelningsläge. Tjänsten exponerar flera åtgärder som skickar och tar emot strömmar. Det här exemplet är lokalt. Både klienten och tjänsten är konsolprogram.

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Windows Communication Foundation (WCF) kan kommunicera i två överföringslägen – buffrade eller strömmande. I standardläget för buffrad överföring måste ett meddelande levereras helt innan en mottagare kan läsa det. I läget för direktuppspelningsöverföring kan mottagaren börja bearbeta meddelandet innan det levereras helt. Strömningsläget är användbart när den information som skickas är lång och kan bearbetas seriellt. Strömningsläge är också användbart när meddelandet är för stort för att vara helt buffrat.

Strömnings- och tjänstkontrakt

Strömning är något att överväga när du utformar ett tjänstkontrakt. Om en åtgärd tar emot eller returnerar stora mängder data bör du överväga att strömma dessa data för att undvika hög minnesanvändning på grund av buffring av indata- eller utdatameddelanden. Om du vill strömma data måste parametern som innehåller dessa data vara den enda parametern i meddelandet. Om indatameddelandet till exempel är det som ska strömmas måste åtgärden ha exakt en indataparameter. Om utdatameddelandet ska strömmas måste åtgärden ha antingen exakt en utdataparameter eller ett returvärde. I båda fallen måste parametern eller returvärdetypen vara antingen Stream, Messageeller IXmlSerializable. Följande är tjänstkontraktet som används i det här strömningsexemplet.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IStreamingSample
{
    [OperationContract]
    Stream GetStream(string data);
    [OperationContract]
    bool UploadStream(Stream stream);
    [OperationContract]
    Stream EchoStream(Stream stream);
    [OperationContract]
    Stream GetReversedStream();

}

Åtgärden GetStream tar emot vissa indata som en sträng, som buffrats och returnerar en Stream, som strömmas. Omvänt UploadStream tar in en Stream (strömmad) och returnerar en bool (buffrad). EchoStream tar och returnerar Stream och är ett exempel på en åtgärd vars indata- och utdatameddelanden båda strömmas. GetReversedStream Slutligen tar inga indata och returnerar en Stream (strömmad).

Aktivera strömmade överföringar

Att definiera åtgärdskontrakt enligt tidigare beskrivning ger direktuppspelning på programmeringsmodellnivå. Om du stannar där buffrar transporten fortfarande hela meddelandeinnehållet. Om du vill aktivera transportströmning väljer du ett överföringsläge för transportens bindningselement. Bindningselementet har en TransferMode egenskap som kan anges till Buffered, Streamed, StreamedRequesteller StreamedResponse. Ställa in överföringsläget för att Streamed aktivera direktuppspelningskommunikation i båda riktningarna. Om du ställer in överföringsläget på StreamedRequest eller StreamedResponse aktiverar direktuppspelningskommunikation endast i begäran eller svaret.

Exponerar basicHttpBindingTransferMode egenskapen för bindningen som och NetTcpBindingNetNamedPipeBinding. För andra transporter måste du skapa en anpassad bindning för att ange överföringsläget.

Följande konfigurationskod från exemplet visar hur du ställer in TransferMode egenskapen på direktuppspelning på basicHttpBinding och en anpassad HTTP-bindning:

<!-- An example basicHttpBinding using streaming. -->
<basicHttpBinding>
  <binding name="HttpStreaming" maxReceivedMessageSize="67108864"
           transferMode="Streamed"/>
</basicHttpBinding>
<!-- An example customBinding using HTTP and streaming.-->
<customBinding>
  <binding name="Soap12">
    <textMessageEncoding messageVersion="Soap12WSAddressing10" />
    <httpTransport transferMode="Streamed"
                   maxReceivedMessageSize="67108864"/>
  </binding>
</customBinding>

Förutom att ange transferMode till Streamedanger maxReceivedMessageSize den tidigare konfigurationskoden till 64 MB. Som en försvarsmekanism maxReceivedMessageSize sätter ett tak på den maximala tillåtna storleken på meddelanden vid mottagning. Standardvärdet maxReceivedMessageSize är 64 KB, vilket vanligtvis är för lågt för strömningsscenarier.

Bearbeta data när de strömmas

Åtgärderna GetStream, UploadStream och EchoStream alla hanterar att skicka data direkt från en fil eller spara mottagna data direkt till en fil. I vissa fall finns det dock ett krav på att skicka eller ta emot stora mängder data och utföra viss bearbetning på segment av data när de skickas eller tas emot. Ett sätt att hantera sådana scenarier är att skriva en anpassad ström (en klass som härleds från Stream) som bearbetar data när de läs- eller skrivs. Åtgärden GetReversedStream och ReverseStream klassen är ett exempel på detta.

GetReversedStream skapar och returnerar en ny instans av ReverseStream. Den faktiska bearbetningen sker när systemet läser från objektet ReverseStream . Implementeringen ReverseStream.Read läser ett segment byte från den underliggande filen, återställer dem och returnerar sedan omvända byte. Detta återställer inte hela filinnehållet. den omvänt en bit byte i taget. Det här är ett exempel för att visa hur du kan utföra dataströmbearbetning när innehållet läse eller skrivs från och till dataströmmen.

class ReverseStream : Stream
{

    FileStream inStream;
    internal ReverseStream(string filePath)
    {
        //Opens the file and places a StreamReader around it.
        inStream = File.OpenRead(filePath);
    }

    // Other methods removed for brevity.

    public override int Read(byte[] buffer, int offset, int count)
    {
        int countRead=inStream.Read(buffer, offset,count);
        ReverseBuffer(buffer, offset, countRead);
        return countRead;
    }

    public override void Close()
    {
        inStream.Close();
        base.Close();
    }
    protected override void Dispose(bool disposing)
    {
        inStream.Dispose();
        base.Dispose(disposing);
    }
    void ReverseBuffer(byte[] buffer, int offset, int count)
    {
        int i, j;
        for (i = offset, j = offset + count - 1; i < j; i++, j--)
        {
            byte currenti = buffer[i];
            buffer[i] = buffer[j];
            buffer[j] = currenti;
        }

    }
}

Köra exemplet

Om du vill köra exemplet skapar du först både tjänsten och klienten genom att följa anvisningarna i slutet av det här dokumentet. Starta sedan tjänsten och klienten i två olika konsolfönster. När klienten startar väntar den på att du ska trycka på RETUR när tjänsten är klar. Klienten anropar sedan metoderna GetStream(), UploadStream() och GetReversedStream() först via HTTP och sedan via TCP. Här är ett exempel på utdata från tjänsten följt av exempelutdata från klienten:

Tjänstutdata:

The streaming service is ready.
Press <ENTER> to terminate service.

Saving to file D:\...\uploadedfile
......................
File D:\...\uploadedfile saved
Saving to file D:\...\uploadedfile
...............
File D:\...\uploadedfile saved

Klientutdata:

Press <ENTER> when service is ready
------ Using HTTP ------
Calling GetStream()
Saving to file D:\...\clientfile
......................
Wrote 33405 bytes to stream

File D:\...\clientfile saved
Calling UploadStream()
Calling GetReversedStream()
Saving to file D:\...\clientfile
......................
Wrote 33405 bytes to stream

File D:\...\clientfile saved
------ Using Custom HTTP ------
Calling GetStream()
Saving to file D:\...\clientfile
...............
Wrote 33405 bytes to stream

File D:\...\clientfile saved
Calling UploadStream()
Calling GetReversedStream()
Saving to file D:\...\clientfile
...............
Wrote 33405 bytes to stream

File D:\...\clientfile saved

Press <ENTER> to terminate client.

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.

Kommentar

Om du använder Svcutil.exe för att återskapa konfigurationen för det här exemplet måste du ändra slutpunktsnamnet i klientkonfigurationen så att det matchar klientkoden.