Strumieniowy transfer komunikatów
Transporty programu Windows Communication Foundation (WCF) obsługują dwa tryby transferu komunikatów:
Buforowane transfery przechowują cały komunikat w buforze pamięci do momentu zakończenia transferu. Aby odbiorca mógł go odczytać, musi zostać całkowicie dostarczony buforowany komunikat.
Transfery przesyłane strumieniowo uwidaczniają komunikat jako strumień. Odbiornik rozpoczyna przetwarzanie komunikatu, zanim zostanie całkowicie dostarczony.
Transfery przesyłane strumieniowo mogą zwiększyć skalowalność usługi, eliminując wymagania dotyczące dużych pamięci. To, czy zmiana trybu transferu zwiększa skalowalność, zależy od rozmiaru przesyłanych komunikatów. Duże rozmiary komunikatów faworyzują korzystanie z transferów przesyłanych strumieniowo.
Domyślnie transporty http, TCP/IP i nazwane potoki używają buforowanych transferów. W tym dokumencie opisano sposób przełączania tych transportów z buforowanego do trybu przesyłania strumieniowego i konsekwencji tego działania.
Włączanie strumieniowych transferów
Wybór między trybami buforowania i przesyłania strumieniowego odbywa się na element powiązania transportu. Element powiązania ma TransferMode właściwość, którą można ustawić na Buffered
, Streamed
, StreamedRequest
lub StreamedResponse
. Ustawienie trybu transferu w celu Streamed
włączenia komunikacji przesyłanej strumieniowo w obu kierunkach. Ustawienie trybu transferu na StreamedRequest
lub StreamedResponse
umożliwia komunikację strumieniową tylko w określonym kierunku.
Powiązania BasicHttpBinding, NetTcpBindingi NetNamedPipeBinding uwidaczniają TransferMode właściwość . W przypadku innych transportów należy utworzyć niestandardowe powiązanie, aby ustawić tryb transferu.
Decyzja o użyciu buforowanych lub przesyłanych strumieniowo transferów jest lokalną decyzją punktu końcowego. W przypadku transportu HTTP tryb transferu nie jest propagowany przez połączenie ani do serwerów i innych pośredników. Ustawienie trybu transferu nie jest odzwierciedlane w opisie interfejsu usługi. Po wygenerowaniu klasy klienta dla usługi należy edytować plik konfiguracji dla usług, które mają być używane z transferami strumieniowymi, aby ustawić tryb. W przypadku transportu tcp i nazwanych potoków tryb transferu jest propagowany jako asercji zasad.
Aby zapoznać się z przykładami kodu, zobacz Instrukcje: włączanie przesyłania strumieniowego.
Włączanie przesyłania strumieniowego asynchronicznego
Aby włączyć przesyłanie strumieniowe asynchroniczne, dodaj DispatcherSynchronizationBehavior zachowanie punktu końcowego do hosta usługi i ustaw jego AsynchronousSendEnabled właściwość na true
.
Ta wersja programu WCF dodała również możliwość rzeczywistego asynchronicznego przesyłania strumieniowego po stronie wysyłania. Zwiększa to skalowalność usługi w scenariuszach, w których komunikaty przesyłane strumieniowo są przesyłane strumieniowo do wielu klientów, z których niektóre działają wolno podczas odczytu; być może ze względu na przeciążenie sieci lub w ogóle nie odczytuje. W tych scenariuszach program WCF nie blokuje już poszczególnych wątków w usłudze na klienta. Dzięki temu usługa może przetwarzać wielu innych klientów, co zwiększa skalowalność usługi.
Ograniczenia dotyczące przesyłanych strumieniowo
Użycie trybu przesyłania strumieniowego powoduje, że czas wykonywania wymusza dodatkowe ograniczenia.
Operacje wykonywane w ramach transportu przesyłanego strumieniowo mogą mieć kontrakt z co najwyżej jednym parametrem wejściowym lub wyjściowym. Ten parametr odpowiada całej treści komunikatu i musi być typem Messagepochodnym Streamlub implementacją IXmlSerializable . Posiadanie wartości zwracanej dla operacji jest równoważne z posiadaniem parametru wyjściowego.
Niektóre funkcje programu WCF, takie jak niezawodne komunikaty, transakcje i zabezpieczenia na poziomie komunikatów protokołu SOAP, polegają na buforowaniu komunikatów na potrzeby transmisji. Korzystanie z tych funkcji może zmniejszyć lub wyeliminować korzyści z wydajności uzyskane przy użyciu przesyłania strumieniowego. Aby zabezpieczyć transport przesyłany strumieniowo, należy używać tylko zabezpieczeń na poziomie transportu lub używać zabezpieczeń na poziomie transportu oraz zabezpieczeń komunikatów tylko do uwierzytelniania.
Nagłówki protokołu SOAP są zawsze buforowane, nawet jeśli tryb transferu jest ustawiony na przesyłanie strumieniowe. Nagłówki komunikatu nie mogą przekraczać rozmiaru limitu przydziału MaxBufferSize
transportu. Aby uzyskać więcej informacji na temat tego ustawienia, zobacz Limity przydziału transportu.
Różnice między transferami buforowanych i przesyłanych strumieniowo
Zmiana trybu transferu z buforowanego na strumieniowy powoduje również zmianę kształtu kanału natywnego protokołu TCP i nazwanych transportów potoków. W przypadku buforowanych transferów kształt kanału natywnego to IDuplexSessionChannel. W przypadku transferów przesyłanych strumieniowo kanały natywne to IRequestChannel i IReplyChannel. Zmiana trybu transferu w istniejącej aplikacji korzystającej bezpośrednio z tych transportów (a nie za pośrednictwem kontraktu usługi) wymaga zmiany oczekiwanego kształtu kanału dla fabryk kanałów i odbiorników.