Bagikan melalui


Stream

Sampel Stream menunjukkan penggunaan komunikasi mode transfer streaming. Layanan ini memaparkan beberapa operasi yang mengirim dan menerima aliran. Sampel ini dihosting sendiri. Klien dan layanan adalah program konsol.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Windows Communication Foundation (WCF) dapat berkomunikasi dalam dua mode transfer—di-buffer atau streaming. Dalam mode transfer buffer default, pesan harus dikirim sepenuhnya sebelum penerima dapat membacanya. Dalam mode transfer streaming, penerima dapat mulai memproses pesan sebelum benar-benar dikirim. Mode streaming berguna saat informasi yang diteruskan isinya panjang dan dapat diproses secara serial. Mode streaming juga berguna saat pesan terlalu besar untuk sepenuhnya di-buffer.

Kontrak Streaming dan Layanan

Streaming adalah sesuatu yang perlu dipertimbangkan saat merancang kontrak layanan. Jika operasi menerima atau mengembalikan data dalam jumlah besar, Anda harus mempertimbangkan streaming data ini untuk menghindari pemanfaatan memori yang tinggi karena buffering pesan input atau output. Untuk mengalirkan data, parameter yang menyimpan data tersebut harus menjadi satu-satunya parameter dalam pesan. Misalnya, jika pesan input adalah yang akan di-streaming, operasi harus memiliki satu parameter input. Demikian pula, jika pesan output akan dialirkan, operasi harus memiliki tepat satu parameter output atau nilai yang dikembalikan. Dalam kedua kasus, parameter atau jenis nilai yang dikembalikan harus Stream, Message, atau IXmlSerializable. Berikut ini adalah kontrak layanan yang digunakan dalam sampel streaming ini.

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

}

Operasi GetStream menerima beberapa data input sebagai string, yang di-buffer, dan mengembalikan Stream, yang dialirkan. Sebaliknya, UploadStream mengambil Stream (dialirkan) dan mengembalikan bool (di-buffer). EchoStream menggunakan dan menampilkan Stream dan merupakan contoh operasi yang pesan input dan output-nya di-streaming. Di akhir, GetReversedStream tidak menggunakan input dan menampilkan Stream (di-streaming).

Mengaktifkan Transfer Yang Dialirkan

Menentukan kontrak operasi seperti yang dijelaskan sebelumnya menyediakan streaming di tingkat model pemrograman. Jika Anda berhenti di sana, transportasi masih menyangga seluruh konten pesan. Untuk mengaktifkan streaming transportasi, pilih mode transfer pada elemen pengikatan transportasi. Elemen pengikatan memiliki properti TransferMode yang dapat diatur ke Buffered, Streamed, StreamedRequest, atau StreamedResponse. Jika mode transfer di atur ke Streamed, komunikasi dapat dialirkan di kedua arah. Mengatur mode transfer ke StreamedRequest atau StreamedResponse memungkinkan komunikasi streaming hanya dalam permintaan atau respons.

basicHttpBinding mengekspos properti TransferMode pada pengikatan seperti halnya NetTcpBinding dan NetNamedPipeBinding. Untuk transportasi lain, Anda harus membuat pengikatan kustom untuk mengatur mode transfer.

Kode konfigurasi berikut dari sampel menunjukkan pengaturan properti TransferMode ke aliran pada basicHttpBinding dan pengikatan HTTP kustom:

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

Selain mengatur transferMode ke Streamed, kode konfigurasi sebelumnya mengatur maxReceivedMessageSize ke 64MB. Sebagai mekanisme pertahanan, maxReceivedMessageSize menempatkan batas pada ukuran maksimum pesan yang diizinkan pada penerimaan. Defaultnya maxReceivedMessageSize adalah 64 KB, yang biasanya terlalu rendah untuk skenario streaming.

Memproses data saat dialirkan

Operasi GetStream, UploadStream dan EchoStream semua menangani pengiriman data langsung dari file atau menyimpan data yang diterima langsung ke file. Namun dalam beberapa kasus, ada persyaratan untuk mengirim atau menerima data dalam jumlah besar dan melakukan beberapa pemrosesan pada potongan data saat dikirim atau diterima. Salah satu cara untuk mengatasi skenario tersebut adalah dengan menulis aliran kustom (kelas yang berasal dari Stream) yang memproses data saat dibaca atau ditulis. Operasi GetReversedStream dan kelas ReverseStream adalah contoh dari ini.

GetReversedStream membuat dan menampilkan instans baru ReverseStream. Pemrosesan aktual terjadi saat sistem membaca dari objek ReverseStream tersebut. Implementasi ReverseStream.Read membaca sepotong byte dari file yang mendasar, membalikkannya, lalu mengembalikan byte terbalik. Implementasi objek ini tidak membalikkan seluruh konten file; objek tersebut membalikkan satu potongan byte pada satu waktu. Perilaku ini merupakan contoh untuk menunjukkan bagaimana Anda dapat melakukan pemrosesan aliran saat konten sedang dibaca atau ditulis dari dan ke aliran.

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

    }
}

Menjalankan sampel

Untuk menjalankan sampel, pertama-tama buat layanan dan klien dengan mengikuti petunjuk di akhir dokumen ini. Kemudian mulai layanan dan klien di dua jendela konsol yang berbeda. Ketika klien dimulai, menunggu Anda untuk menekan ENTER ketika layanan siap. Klien kemudian memanggil metode GetStream(), UploadStream() dan GetReversedStream() pertama melalui HTTP dan kemudian melalui TCP. Berikut adalah contoh output dari layanan diikuti dengan contoh output dari klien:

Output Layanan:

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

Output Klien:

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.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.

Catatan

Jika Anda menggunakan Svcutil.exe untuk meregenerasi konfigurasi untuk sampel ini, pastikan untuk mengubah nama titik akhir dalam konfigurasi klien agar sesuai dengan kode klien.