C # Как конвертировать MessageBodyStream в MemoryStream? - PullRequest
3 голосов
/ 11 декабря 2010

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

Ответы [ 4 ]

6 голосов
/ 07 июля 2014

Чтобы преобразовать 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.

И все готово !!

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

2 голосов
/ 11 декабря 2010

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

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);
1 голос
/ 11 декабря 2010

Message.BodyStream относится к типу Stream.

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

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

0 голосов
/ 28 февраля 2017

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

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

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

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

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

...