【问题标题】:WCF exception while getting stream length获取流长度时出现 WCF 异常
【发布时间】:2010-08-30 15:04:27
【问题描述】:

我有一个返回流的 WCF Web 服务。在客户端,当我尝试使用下面的代码读取它时,我在“Byte[] buffer = new Byte[outputMessage.FileByteStream.Length];”行出现异常说 System.Notsupported。请告诉我我在这里做错了什么。

        FileMetaData metaData = new FileMetaData();
        metaData.ProductIDsArray = new string[] { "1", "2" };
        metaData.AuthenticationKey = "test";
        FileDownloadMessage inputParam = new FileDownloadMessage(metaData);
        FileTransferServiceClient obj = new FileTransferServiceClient();
        FileDownloadReturnMessage outputMessage = obj.DownloadFile(inputParam);
        Byte[] buffer = new Byte[outputMessage.FileByteStream.Length];
        int byteRead = outputMessage.FileByteStream.Read(buffer, 0, buffer.Length);
        Response.Buffer = false;

        Response.Buffer = false;
        Response.ContentType = "application/x-zip";
        Response.AppendHeader("content-length", buffer.Length.ToString());
        Stream outStream = Response.OutputStream;


        while (byteRead > 0)
        {
            outStream.Write(buffer, 0, buffer.Length);
            byteRead = outputMessage.FileByteStream.Read(buffer, 0, buffer.Length);
        }
        outputMessage.FileByteStream.Close();
        outStream.Close();

【问题讨论】:

  • 那是很奇怪的代码。为什么你已经使用while循环来读取流?
  • 是的,我不会不同意你的观点,因为我对此很陌生。请你能建议我做同样的更好的方法。谢谢

标签: wcf


【解决方案1】:

您正在读取的流不支持获取流的长度(很可能是因为在下载整个文件之前不会知道长度)。分块读取流 - 类似于 while 循环的方式,但有一个固定大小的缓冲区 - 一旦为 byteRead 返回 0,您就会知道您已经到达流的末尾。

【讨论】:

  • 感谢您的回复。我应该给 bytearray 什么大小?我不知道我将收到的文件的大小,它可以是 10 mb,也可以是 500 mb。请指教
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 2016-07-26
  • 1970-01-01
  • 2022-10-19
  • 2017-03-14
  • 2019-08-19
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多