2010-12-10 3 views
2

Je retourne un flux à partir d'un service WCF et essaye de le convertir en MemoryStream. Mais dans l'application web où je consomme le service WCF, j'obtiens le résultat de "MessageBodyStream" où je m'attendais "System.IO .Courant". Comment puis-je convertir cela en MemoryStream?C# Comment convertir MessageBodyStream en MemoryStream?

Répondre

0

Message.BodyStream est de type Stream. Vous aurez besoin de lire le flux complet dans votre MemoryStream afin de le convertir.

Je ne sais pas si c'est ce que vous voulez réellement, mais vous pouvez simplement affecter la valeur à une variable MemoryStream, singe MemoryStream hérite de Stream.

2

Parfois, les cours d'eau viennent et vous ne savez pas comment ils sont gros, pour que l'utilisation de ce code:

public static byte[] ReadToEnd(System.IO.Stream stream) 
{ 
    long originalPosition = stream.Position; 

    byte[] readBuffer = new byte[4096]; 

    int totalBytesRead = 0; 
    int bytesRead; 

    while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
    { 
     totalBytesRead += bytesRead; 

     if (totalBytesRead == readBuffer.Length) 
     { 
      int nextByte = stream.ReadByte(); 
      if (nextByte != -1) 
      { 
       byte[] temp = new byte[readBuffer.Length * 2]; 
       Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
       Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); 
       readBuffer = temp; 
       totalBytesRead++; 
      } 
     } 
    } 

    byte[] buffer = readBuffer; 
    if (readBuffer.Length != totalBytesRead) 
    { 
     buffer = new byte[totalBytesRead]; 
     Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
    } 
    return buffer; 
} 

Ensuite, une fois que vous avez le tableau d'octets vous pouvez convertir en un flux de mémoire ...

byte[] myBytes = ReadToEnd(theStream); 
    Stream theMemStream = new MemoryStream(myBytes, 0, myBytes.Length); 
4

pour convertir MessageBodyStream à un MemoryStream, procédez comme suit:

MemoryStream stream = new MemoryStream(); 
messageStream.CopyTo(stream); // Assuming messageStream is your MessageBodyStream 
stream.Position = 0; // Be sure to set the position to 0 before using it. 

Et vous avez terminé !!

Espérons que cela aide.

0

On dirait que le tampon dans l'exemple de code va doubler de taille chaque fois qu'il est allongé dans la boucle interne. Ainsi, au lieu de

byte[] temp = new byte[readBuffer.Length * 2] 

ne serait-il pas préférable d'ajouter au lieu de multiplier, par ex. Idéalement, nous pourrions utiliser ici une variable au lieu d'une valeur codée en dur, mais j'espère que cela illustre bien le problème.