Aracılığıyla paylaş


Akış

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 şirket içinde barındırılır. hem istemci hem de hizmet konsol programlarıdır.

Not

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

Windows Communication Foundation (WCF), arabelleğe alınan veya akış olan 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 edilmesi 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, akışa alınabilecek giriş iletisiyse, 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ü , Messageveya IXmlSerializableolmalıdırStream. 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 arabelleğe alınan bir dize olarak alır ve akışı yapılan bir Streamdöndürür. Buna karşılık, UploadStream bir Stream alır (akışlı) ve döndürür bool (arabelleğe alınan). EchoStream alır ve döndürür Stream ve giriş ve çıkış iletilerinin her ikisi de akışa alınan 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 , , StreamedStreamedRequestveya StreamedResponseolarak ayarlanabilen Bufferedbir TransferMode ö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 ve NetNamedPipeBindinggibi NetTcpBinding özelliğini kullanıma sunarTransferMode. 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, özelliğini ve özel bir HTTP bağlaması üzerinde akışa ayarlamayı TransferModebasicHttpBinding 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>

olarak ayarlanmasına transferModeStreamedek olarak, önceki yapılandırma kodu 64 MB olarak ayarlar maxReceivedMessageSize . 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ışa alınan 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 alma yollarından biri, verileri okundu veya yazıldıkça işleyen özel bir akış (öğesinden Streamtüretilen bir sınıf) yazmaktır. İşlem GetReversedStream ve ReverseStream sınıf bunun bir örneğidir.

GetReversedStream yeni bir örneğini ReverseStreamoluşturur ve 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ırma

Ö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 yöntemlerini çağırır ve GetReversedStream() önce HTTP ve ardından TCP üzerinden çağrır.GetStream()UploadStream() 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çin Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

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

  3. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

Not

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.