我正在使用RESTful WCF服务。其中一个服务方法返回byte [](包含一个文件)。
在客户端,我有一些代码使用WebRequest类来调用该特定服务方法。使用WebRequest,我得到的响应流如下:
Stream stream = webReq.GetResponse().GetResponseStream();
从这个流中,我然后重建一个byte [],然后在本地输出File。问题是客户端的重建文件与服务端返回的文件不相似(我得到的损坏的PDF文件大小比从服务端发送的文件大得多)。就在服务方法返回byte []之前,我将那个byte []输出到服务端的磁盘上并且它创建了文件很好...这表明返回byte []的方法和我的客户端之间出错了从客户端的Stream重构byte [] ...从Stream重建byte [],我使用的是以前在stackoverflow上发布的方法:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
任何可能出错的想法?
答案 0 :(得分:1)
我猜这个服务器的响应除了原始字节外还包含一些信封。像XML信封或其他东西。当然,假设在响应中字节是base64编码的字符串,因为您无法将二进制数据存储到XML中。它还可以解释为什么在客户端上获得比服务器发送的实际PDF更大的缓冲区。
这当然取决于您的WCF服务使用什么绑定以及如何配置。当您转储MemoryStream的内容时,您正在客户端上阅读,您看到了什么?这应该为您提供有关如何在HTTP响应正文中编码实际PDF文件的进一步提示。