在Web服务soap响应中发送二进制文件

时间:2009-06-30 15:10:57

标签: c# web-services

我有一个返回二进制文件的ftp web请求的响应流。 我想将二进制数据转换为byte [],然后对该数组进行编码并将其作为Web服务响应发送。

Stream responseStream = webResponse.GetResponseStream();
byte[] byteToEncode= ReadFully(responseStream,1024);
String str=Convert.ToBase64String(byteToEncode);

我使用我在网上找到的函数将流转换为byte []

/// <summary>
/// Reads data from a stream until the end is reached. The
/// data is returned as a byte array. An IOException is
/// thrown if any of the underlying IO calls fail.
/// </summary>
/// <param name="stream">The stream to read data from</param>
/// <param name="initialLength">The initial buffer length</param>

public static byte[] ReadFully (Stream stream, int initialLength)
{
    // If we've been passed an unhelpful initial length, just  use 32K.
    if (initialLength < 1)
    {
        initialLength = 32768;
    }

    byte[] buffer = new byte[initialLength];
    int read=0;

  int chunk;
    while ( (chunk = stream.Read(buffer, read, buffer.Length-read)) > 0)
    {
        read += chunk;

        // If we've reached the end of our buffer, check to see if there's
        // any more information

        if (read == buffer.Length)
        {
            int nextByte = stream.ReadByte();

            // End of stream? If so, we're done

            if (nextByte==-1)
            {
                return buffer;
            }

            // Nope. Resize the buffer, put in the byte we've just
            // read, and continue
            byte[] newBuffer = new byte[buffer.Length*2];

            Array.Copy(buffer, newBuffer, buffer.Length);
            newBuffer[read]=(byte)nextByte;
            buffer = newBuffer;
            read++;
        }
    }
    // Buffer is now too big. Shrink it.

    byte[] ret = new byte[read];
    Array.Copy(buffer, ret, read);
    return ret;
} 

但我得到一个例外说:

This stream does not support seek operations.

我将不胜感激。

谢谢, 莎拉

1 个答案:

答案 0 :(得分:0)

您可能需要重新编写ReadFully函数以避免像Length这样的属性,这些属性需要了解有关流的更多信息,而不是完全接收完整流时的信息。