2010-12-10 2 views
2

Я возвращаю поток из службы WCF и пытаюсь преобразовать его в MemoryStream. Но в веб-приложении, где в потреблении службы WCF, я получаю результат от «MessageBodyStream», где ожидал «System.IO» .Поток". Как я могу преобразовать это в MemoryStream?C# Как преобразовать MessageBodyStream в MemoryStream?

ответ

0

Message.BodyStream имеет тип Stream.

Вам нужно будет прочитать весь поток в вашем MemoryStream, чтобы его преобразовать.

Я не знаю, действительно ли это то, что вы действительно хотите, но вы можете просто присвоить значение переменной MemoryStream, singe MemoryStream наследует от Stream.

2

Иногда потоки приходят и вы не знаете, насколько они являются, для этого использовать этот код:

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; 
} 

Затем, если у вас есть массив вы можете преобразовать его в поток памяти ...

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

для преобразования MessageBodyStream в MemoryStream, выполните следующие действия:

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. 

И вы сделали !!

Надеюсь, это поможет.

0

Похоже, что буфер в примере кода удваивается по размеру каждый раз, когда он удлиняется во внутреннем цикле. Таким образом, вместо

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

не было бы лучше добавить вместо умножения, например.

byte[] temp = new byte[readBuffer.Length + 4096] 

В идеале мы можем использовать переменную вместо жестко закодированного значения здесь, но я надеюсь, что это передает точку.

Смежные вопросы