Sdílet prostřednictvím


Stream

Ukázka streamu ukazuje použití komunikace v režimu přenosu streamování. Služba zveřejňuje několik operací, které odesílají a přijímají datové proudy. Tato ukázka je v místním prostředí. 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 – ve vyrovnávací paměti nebo streamování. 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á nějaká vstupní data jako řetězec, který je uložen do vyrovnávací paměti, a vrátí Stream, který se streamuje. Naopak přebírá UploadStreamStream (streamovaný) a vrací bool (vyrovnávací paměť). 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 tam zastavíte, přenos pořád do vyrovnávací paměti zachytá celý obsah zprávy. 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 streamovací komunikaci nebo StreamedResponse povolení komunikace pouze v požadavku nebo odpovědi.

Zpřístupňuje basicHttpBindingTransferMode vlastnost vazby 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 ukázky ukazuje nastavení TransferMode vlastnosti na 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í na , transferModeStreamedpř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í

GetStreamUploadStream Operace a EchoStream všechny 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. Příkladem GetReversedStream je operace a ReverseStream třída.

GetReversedStreamvytvoří a vrátí 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;
        }

    }
}

Spuštění ukázky

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.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

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

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části 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.