如何将MessageBodyStream转换为MemoryStream的C#方法?

3

我正在从WCF服务返回一个流,并尝试将其转换为MemoryStream。但是在消费WCF服务的Web应用程序中,我得到的结果是“MessageBodyStream”,而我期望的是“System.IO.Stream”。如何将其转换为MemoryStream?

4个回答

6

将 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.

完成了!

希望这有所帮助。


谢谢你的回答。省了很多时间。 - Matt Allen

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

1

Message.BodyStreamStream 类型。

你需要将整个流读入到你的 MemoryStream 中才能进行转换。

我不知道这是否是你真正想要的,但你可以将值简单地分配给一个 MemoryStream 变量,因为 MemoryStream 继承自 Stream


0

看起来示例代码中的缓冲区每次在内部循环中加长时都会增加一倍大小。因此,不是

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

加法比乘法更好,例如:

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

理想情况下,我们可以在这里使用一个变量而不是硬编码的值,但我希望这能传达出要点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接