Överföring av strömmande meddelande
WCF-transporter (Windows Communication Foundation) stöder två lägen för överföring av meddelanden:
Buffrade överföringar innehåller hela meddelandet i en minnesbuffert tills överföringen är klar. Ett buffrat meddelande måste levereras helt innan en mottagare kan läsa det.
Strömmade överföringar exponerar meddelandet som en ström. Mottagaren börjar bearbeta meddelandet innan det levereras helt.
Strömmade överföringar kan förbättra skalbarheten för en tjänst genom att eliminera kravet på stora minnesbuffertar. Om bytet av överföringsläge förbättrar skalbarheten beror på storleken på de meddelanden som överförs. Stora meddelandestorlekar föredrar att använda strömmade överföringar.
Som standard använder HTTP, TCP/IP och namngivna rörtransporter buffrade överföringar. Det här dokumentet beskriver hur du växlar dessa transporter från ett buffrat till strömmat överföringsläge och konsekvenserna av att göra det.
Aktivera strömmade överföringar
Du väljer mellan buffrade och strömmade överföringslägen på bindningselementet i transporten. Bindningselementet har en TransferMode egenskap som kan anges till Buffered
, Streamed
, StreamedRequest
eller StreamedResponse
. Ställa in överföringsläget för att Streamed
aktivera direktuppspelningskommunikation i båda riktningarna. Om du anger överföringsläget till StreamedRequest
eller StreamedResponse
aktiverar direktuppspelningskommunikation endast i angiven riktning.
Bindningarna BasicHttpBinding, NetTcpBindingoch NetNamedPipeBinding exponerar TransferMode egenskapen. För andra transporter måste du skapa en anpassad bindning för att ange överföringsläget.
Beslutet att använda buffrade eller strömmade överföringar är ett lokalt beslut för slutpunkten. För HTTP-transporter sprids inte överföringsläget över en anslutning eller till servrar och andra mellanhänder. Att ange överföringsläget återspeglas inte i beskrivningen av tjänstgränssnittet. När du har genererat en klientklass för en tjänst måste du redigera konfigurationsfilen för tjänster som ska användas med strömmade överföringar för att ange läget. För TCP och namngivna rörtransporter sprids överföringsläget som en principkontroll.
Kodexempel finns i Så här aktiverar du direktuppspelning.
Aktivera asynkron direktuppspelning
Om du vill aktivera asynkron direktuppspelning lägger du till DispatcherSynchronizationBehavior slutpunktsbeteendet till tjänstvärden och anger dess AsynchronousSendEnabled egenskap till true
.
Den här versionen av WCF har också lagt till funktionen för sann asynkron direktuppspelning på sändningssidan. Detta förbättrar skalbarheten för tjänsten i scenarier där den strömmar meddelanden till flera klienter, varav vissa är långsamma vid läsning. på grund av överbelastning i nätverket eller att de inte läser alls. I dessa scenarier blockerar WCF inte längre enskilda trådar på tjänsten per klient. Detta säkerställer att tjänsten kan bearbeta många fler klienter och därmed förbättra tjänstens skalbarhet.
Begränsningar för strömmade överföringar
Om du använder det strömmade överföringsläget kan körningstiden framtvinga ytterligare begränsningar.
Åtgärder som utförs i en strömmad transport kan ha ett kontrakt med högst en indata- eller utdataparameter. Parametern motsvarar hela meddelandets brödtext och måste vara en Message, en härledd typ av Streameller en IXmlSerializable implementering. Att ha ett returvärde för en åtgärd motsvarar att ha en utdataparameter.
Vissa WCF-funktioner, till exempel tillförlitliga meddelanden, transaktioner och SÄKERHET på SOAP-meddelandenivå, förlitar sig på buffring av meddelanden för överföringar. Om du använder dessa funktioner kan du minska eller eliminera de prestandafördelar som uppnås med hjälp av strömning. Om du vill skydda en strömmad transport använder du endast säkerhet på transportnivå eller använder säkerhet på transportnivå plus meddelandesäkerhet endast för autentisering.
SOAP-huvuden buffrar alltid, även när överföringsläget är inställt på strömmad. Rubrikerna för ett meddelande får inte överskrida transportkvotens MaxBufferSize
storlek. Mer information om den här inställningen finns i Transportkvoter.
Skillnader mellan buffrade och strömmade överföringar
Om du ändrar överföringsläget från buffrat till strömmat ändras även TCP:s ursprungliga kanalform och namngivna rörtransporter. För buffrade överföringar är IDuplexSessionChannelden inbyggda kanalformen . För strömmade överföringar är IRequestChannel de interna kanalerna och IReplyChannel. Om du ändrar överföringsläget i ett befintligt program som använder dessa transporter direkt (dvs. inte via ett tjänstkontrakt) måste du ändra den förväntade kanalformen för kanalfabriker och lyssnare.