Stream
Stream-exemplet visar användningen av kommunikation i direktuppspelningsläge. Tjänsten exponerar flera åtgärder som skickar och tar emot strömmar. Det här exemplet är lokalt. Både klienten och tjänsten är konsolprogram.
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Windows Communication Foundation (WCF) kan kommunicera i två överföringslägen – buffrade eller strömmande. I standardläget för buffrad överföring måste ett meddelande levereras helt innan en mottagare kan läsa det. I läget för direktuppspelningsöverföring kan mottagaren börja bearbeta meddelandet innan det levereras helt. Strömningsläget är användbart när den information som skickas är lång och kan bearbetas seriellt. Strömningsläge är också användbart när meddelandet är för stort för att vara helt buffrat.
Strömnings- och tjänstkontrakt
Strömning är något att överväga när du utformar ett tjänstkontrakt. Om en åtgärd tar emot eller returnerar stora mängder data bör du överväga att strömma dessa data för att undvika hög minnesanvändning på grund av buffring av indata- eller utdatameddelanden. Om du vill strömma data måste parametern som innehåller dessa data vara den enda parametern i meddelandet. Om indatameddelandet till exempel är det som ska strömmas måste åtgärden ha exakt en indataparameter. Om utdatameddelandet ska strömmas måste åtgärden ha antingen exakt en utdataparameter eller ett returvärde. I båda fallen måste parametern eller returvärdetypen vara antingen Stream
, Message
eller IXmlSerializable
. Följande är tjänstkontraktet som används i det här strömningsexemplet.
[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();
}
Åtgärden GetStream
tar emot vissa indata som en sträng, som buffrats och returnerar en Stream
, som strömmas. Omvänt UploadStream
tar in en Stream
(strömmad) och returnerar en bool
(buffrad). EchoStream
tar och returnerar Stream
och är ett exempel på en åtgärd vars indata- och utdatameddelanden båda strömmas. GetReversedStream
Slutligen tar inga indata och returnerar en Stream
(strömmad).
Aktivera strömmade överföringar
Att definiera åtgärdskontrakt enligt tidigare beskrivning ger direktuppspelning på programmeringsmodellnivå. Om du stannar där buffrar transporten fortfarande hela meddelandeinnehållet. Om du vill aktivera transportströmning väljer du ett överföringsläge för transportens bindningselement. 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 ställer in överföringsläget på StreamedRequest
eller StreamedResponse
aktiverar direktuppspelningskommunikation endast i begäran eller svaret.
Exponerar basicHttpBinding
TransferMode
egenskapen för bindningen som och NetTcpBinding
NetNamedPipeBinding
. För andra transporter måste du skapa en anpassad bindning för att ange överföringsläget.
Följande konfigurationskod från exemplet visar hur du ställer in TransferMode
egenskapen på direktuppspelning på basicHttpBinding
och en anpassad HTTP-bindning:
<!-- 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>
Förutom att ange transferMode
till Streamed
anger maxReceivedMessageSize
den tidigare konfigurationskoden till 64 MB. Som en försvarsmekanism maxReceivedMessageSize
sätter ett tak på den maximala tillåtna storleken på meddelanden vid mottagning. Standardvärdet maxReceivedMessageSize
är 64 KB, vilket vanligtvis är för lågt för strömningsscenarier.
Bearbeta data när de strömmas
Åtgärderna GetStream
, UploadStream
och EchoStream
alla hanterar att skicka data direkt från en fil eller spara mottagna data direkt till en fil. I vissa fall finns det dock ett krav på att skicka eller ta emot stora mängder data och utföra viss bearbetning på segment av data när de skickas eller tas emot. Ett sätt att hantera sådana scenarier är att skriva en anpassad ström (en klass som härleds från Stream) som bearbetar data när de läs- eller skrivs. Åtgärden GetReversedStream
och ReverseStream
klassen är ett exempel på detta.
GetReversedStream
skapar och returnerar en ny instans av ReverseStream
. Den faktiska bearbetningen sker när systemet läser från objektet ReverseStream
. Implementeringen ReverseStream.Read
läser ett segment byte från den underliggande filen, återställer dem och returnerar sedan omvända byte. Detta återställer inte hela filinnehållet. den omvänt en bit byte i taget. Det här är ett exempel för att visa hur du kan utföra dataströmbearbetning när innehållet läse eller skrivs från och till dataströmmen.
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;
}
}
}
Köra exemplet
Om du vill köra exemplet skapar du först både tjänsten och klienten genom att följa anvisningarna i slutet av det här dokumentet. Starta sedan tjänsten och klienten i två olika konsolfönster. När klienten startar väntar den på att du ska trycka på RETUR när tjänsten är klar. Klienten anropar sedan metoderna GetStream()
, UploadStream()
och GetReversedStream()
först via HTTP och sedan via TCP. Här är ett exempel på utdata från tjänsten följt av exempelutdata från klienten:
Tjänstutdata:
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
Klientutdata:
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.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.
Kommentar
Om du använder Svcutil.exe för att återskapa konfigurationen för det här exemplet måste du ändra slutpunktsnamnet i klientkonfigurationen så att det matchar klientkoden.