Aracılığıyla paylaş


Akarsu

Stream örneği, akış aktarım modu iletişiminin kullanımını gösterir. Hizmet, akış gönderen ve alan çeşitli işlemleri kullanıma sunar. Bu örnek kendi sunucusunda barındırılır. hem istemci hem de hizmet konsol programlarıdır.

Uyarı

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Windows Communication Foundation (WCF), tamponlanmış veya akışlı iki aktarım modunda iletişim kurabilir. Varsayılan arabelleğe alınan aktarım modunda, alıcının okuyabilmesi için bir iletinin tamamen teslim edilmiş olması gerekir. Akış aktarım modunda, alıcı iletiyi tamamen teslim edilmeden önce işlemeye başlayabilir. Geçirilen bilgiler uzun olduğunda ve seri olarak işlenebildiğinde akış modu kullanışlıdır. Akış modu, ileti tamamen arabelleğe alınamayacak kadar büyük olduğunda da yararlıdır.

Akış ve Hizmet Sözleşmeleri

Akış, hizmet sözleşmesi tasarlarken dikkate alınması gereken bir şeydir. Bir işlem büyük miktarda veri alır veya döndürürse, giriş veya çıkış iletilerinin arabelleğe alınması nedeniyle yüksek bellek kullanımını önlemek için bu verilerin akışını yapmayı göz önünde bulundurmanız gerekir. Veri akışı yapmak için, bu verileri tutan parametre iletideki tek parametre olmalıdır. Örneğin, giriş mesajı akışa alınacaksa, işlemin tam olarak bir giriş parametresi olmalıdır. Benzer şekilde, çıkış iletisi akışla aktarılacaksa, işlemin tam olarak bir çıkış parametresi veya dönüş değeri olmalıdır. Her iki durumda da parametre veya dönüş değeri türü , Streamveya MessageolmalıdırIXmlSerializable. Aşağıda, bu akış örneğinde kullanılan hizmet sözleşmesi verilmiştir.

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

}

İşlem GetStream bazı giriş verilerini bir dize olarak alır, arabelleğe alınır ve akış halinde bir Stream döndürür. Öte yandan, UploadStream bir Stream (akışlı) alır ve bir bool (arabelleğe alınan) geri verir. EchoStream alır ve Stream döndürür ve giriş ve çıkış iletilerinin her ikisi de akış üzerinden gerçekleştirilen bir işlem örneğidir. Son olarak, GetReversedStream hiçbir giriş almaz ve bir Stream döndürür (akışlı).

Akışlı Aktarımları Etkinleştirme

Daha önce açıklandığı gibi işlem sözleşmelerinin tanımlanması, programlama modeli düzeyinde akış sağlar. Burada durursanız aktarım, ileti içeriğinin tamamını arabelleğe almaya devam eder. Aktarım akışını etkinleştirmek için taşımanın bağlama öğesinde bir aktarım modu seçin. Bağlama öğesinin , , TransferModeBufferedveya Streamedolarak ayarlanabilen StreamedRequestbir StreamedResponse özelliği vardır. Aktarım modunun olarak Streamed ayarlanması, akış iletişimini her iki yönde de etkinleştirir. Aktarım modunun StreamedRequest ayarlanması veya StreamedResponse akış iletişiminin sırasıyla yalnızca istek veya yanıtta ayarlanmasını sağlar.

basicHttpBinding bağlamada TransferMode özelliğini NetTcpBinding ve NetNamedPipeBinding gibi kullanıma sunar. Diğer aktarımlar için aktarım modunu ayarlamak için özel bir bağlama oluşturmanız gerekir.

Örnekteki aşağıdaki yapılandırma kodu, TransferMode özelliğini akışa ve basicHttpBinding üzerinde özel bir HTTP bağlamasına ayarlamayı gösterir.

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

transferMode'yı Streamed olarak ayarlamanın yanı sıra, önceki yapılandırma kodu maxReceivedMessageSize'yi 64MB olarak ayarlar. Savunma mekanizması olarak, maxReceivedMessageSize almada izin verilen en büyük ileti boyutuna bir üst sınır yerleştirir. Varsayılan değer maxReceivedMessageSize 64 KB'tır ve genellikle akış senaryoları için çok düşüktür.

Akış halinde gelen verileri işleme

işlemleri GetStreamUploadStream ve EchoStream tümü verileri doğrudan bir dosyadan gönderme veya alınan verileri doğrudan bir dosyaya kaydetme ile ilgilenir. Ancak bazı durumlarda, büyük miktarda veri gönderme veya alma ve gönderilen veya alınan verilerin öbekleri üzerinde bazı işlemler gerçekleştirme gereksinimi vardır. Bu tür senaryoları ele almanın bir yolu, veriler okunduğunda veya yazıldığında işleyen, Stream öğesinden türetilmiş bir sınıf olan özel bir akış yazmaktır. İşlem GetReversedStream ve ReverseStream sınıf bunun bir örneğidir.

GetReversedStream, ReverseStream adlı yeni bir örnek oluşturur ve geri döndürür. Gerçek işlem, sistem bu ReverseStream nesneden okurken gerçekleşir. Uygulama, ReverseStream.Read temel alınan dosyadan bir bayt öbeği okur, bunları tersine çevirir ve ardından ters çevrilmiş baytları döndürür. Bu işlem tüm dosya içeriğini tersine çevirmez; bir kerede bir bayt öbeklerini tersine çevirir. Bu, içerik akıştan okunurken veya akışa yazılırken akış işlemeyi nasıl gerçekleştirebileceğinizi gösteren bir örnektir.

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

    }
}

Örneği Çalıştır

Örneği çalıştırmak için önce bu belgenin sonundaki yönergeleri izleyerek hem hizmeti hem de istemciyi oluşturun. Ardından hizmeti ve istemciyi iki farklı konsol penceresiyle başlatın. İstemci başlatıldığında, hizmet hazır olduğunda ENTER tuşuna basmanızı bekler. İstemci daha sonra GetStream(), UploadStream() ve GetReversedStream() yöntemlerini önce HTTP, ardından TCP üzerinden çağırır. Aşağıda hizmetten örnek bir çıkış ve ardından istemciden örnek çıktı verilmiştir:

Hizmet Çıkışı:

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

İstemci Çıkışı:

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.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.

Uyarı

Bu örneğin yapılandırmasını yeniden oluşturmak için Svcutil.exe kullanıyorsanız, istemci yapılandırmasındaki uç nokta adını istemci koduyla eşleşecek şekilde değiştirdiğinizden emin olun.