Sdílet prostřednictvím


Streamování

Ukázka streamu ukazuje použití komunikace ve streamovacím přenosovém režimu. Služba zveřejňuje několik operací, které odesílají a přijímají datové proudy. Tato ukázka je hostována interně. Klient i služba jsou konzolové programy.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Windows Communication Foundation (WCF) může komunikovat ve dvou režimech přenosu – vyrovnávacím způsobem nebo streamovaným způsobem. Ve výchozím režimu přenosu ve vyrovnávací paměti musí být zpráva zcela doručena, aby ji příjemce mohl přečíst. V režimu přenosu streamování může příjemce začít zpracovávat zprávu předtím, než se zcela doručí. Režim streamování je užitečný, pokud jsou předané informace dlouhé a lze je zpracovat sériově. Režim streamování je také užitečný, pokud je zpráva příliš velká, aby byla zcela uložena do vyrovnávací paměti.

Streamování a kontrakty služeb

Streamování je něco, co je potřeba zvážit při návrhu kontraktu služby. Pokud operace přijme nebo vrátí velké objemy dat, měli byste zvážit streamování těchto dat, abyste se vyhnuli vysokému využití paměti kvůli ukládání vstupních nebo výstupních zpráv do vyrovnávací paměti. Aby bylo možné streamovat data, musí být parametr, který obsahuje tato data, jediným parametrem ve zprávě. Pokud je vstupní zpráva například ta, která se má streamovat, musí mít operace přesně jeden vstupní parametr. Podobně platí, že pokud se má streamovat výstupní zpráva, musí mít operace buď přesně jeden výstupní parametr, nebo návratovou hodnotu. V obou případech musí být parametr nebo návratový typ hodnoty buď Stream, Messagenebo IXmlSerializable. Následuje kontrakt služby použitý v této ukázce streamování.

[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();

}

Operace GetStream přijímá vstupní data jako řetězec, který je uložen do vyrovnávací paměti, a následně vrátí Stream, který je streamovaný. Naopak, UploadStream přijímá Stream (streamovaný) a vrací bool (vyrovnaný). EchoStream přijímá a vrací Stream a je příkladem operace, jejíž vstupní a výstupní zprávy se streamují. GetReversedStream Nakonec nepřijímá žádné vstupy a vrací Stream (streamovaný).

Povolení streamovaných přenosů

Definování kontraktů operací, jak bylo popsáno dříve, poskytuje streamování na úrovni programovacího modelu. Pokud se tam zastavíte, přenos stále uchovává celý obsah zprávy ve vyrovnávací paměti. Pokud chcete povolit přenosové streamování, vyberte režim přenosu u prvku vazby přenosu. Element vazby má TransferMode vlastnost, kterou lze nastavit na Buffered, Streamed, StreamedRequestnebo StreamedResponse. Nastavením režimu přenosu povolíte Streamed komunikaci streamování v obou směrech. Nastavení režimu přenosu na StreamedRequest nebo StreamedResponse umožňuje streamovací komunikaci buď pouze v požadavku, nebo pouze v odpovědi.

Zpřístupňuje basicHttpBinding vlastnost TransferMode na vazbě, stejně jako NetTcpBinding a NetNamedPipeBinding. Pro jiné přenosy musíte vytvořit vlastní vazbu pro nastavení režimu přenosu.

Následující konfigurační kód z příkladu ukazuje nastavení TransferMode vlastnosti pro streamování u basicHttpBinding vlastní vazby HTTP:

<!-- 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>

Kromě nastavení transferMode na Streamed předchozí konfigurační kód nastaví maxReceivedMessageSize na 64 MB. Jako mechanismus maxReceivedMessageSize ochrany umístí limit na maximální povolenou velikost zpráv při příjmu. Výchozí hodnota maxReceivedMessageSize je 64 kB, což je obvykle příliš nízké pro scénáře streamování.

Zpracování dat při streamování

Operace GetStream, UploadStream a EchoStream se zabývají odesíláním dat přímo ze souboru nebo ukládáním přijatých dat přímo do souboru. V některých případech je však nutné odesílat nebo přijímat velké objemy dat a zpracovávat bloky dat při jejich odesílání nebo přijímání. Jedním ze způsobů, jak takové scénáře vyřešit, je napsat vlastní datový proud (třídu odvozenou z Stream), která zpracovává data při čtení nebo zápisu. Operace GetReversedStream a třída ReverseStream jsou příkladem tohoto.

GetReversedStream vytváří a vrací novou instanci ReverseStream. Skutečné zpracování probíhá při čtení systému z daného ReverseStream objektu. Implementace ReverseStream.Read načte blok bajtů z podkladového souboru, vrátí je zpět a vrátí obrácené bajty. Tím se nevrátí celý obsah souboru; obrátí jeden blok bajtů najednou. Toto je příklad, který ukazuje, jak můžete provádět zpracování datových proudů při čtení nebo zápisu obsahu ze streamu a do datového proudu.

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;
        }

    }
}

Spustit ukázkový kód

Ukázku spustíte tak, že nejprve sestavíte službu i klienta podle pokynů na konci tohoto dokumentu. Pak spusťte službu a klienta ve dvou různých oknech konzoly. Když se klient spustí, počká na stisknutí klávesy ENTER, až bude služba připravená. Klient pak volá metody GetStream(), UploadStream() a GetReversedStream() nejprve přes HTTP a pak přes TCP. Tady je příklad výstupu ze služby následovaný ukázkovým výstupem z klienta:

Výstup služby:

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

Výstup klienta:

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.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.

Poznámka:

Pokud použijete Svcutil.exe k opětovnému vygenerování konfigurace pro tuto ukázku, nezapomeňte upravit název koncového bodu v konfiguraci klienta tak, aby odpovídal kódu klienta.