2012-01-17 166 views
1

我正在使用RESTful WCF服务。其中一个服务方法返回byte [](其中包含一个文件)。Restful WCF服务 - 返回byte []?

在客户端,我有一些代码使用WebRequest类来调用特定的服务方法。使用WebRequest的,我得到的响应流,如:

Stream stream = webReq.GetResponse().GetResponseStream();

从这个流,我再重建一个byte [],然后在本地输出文件。问题是客户端重建的文件与服务端返回的文件不相似(我得到的损坏的PDF文件比服务端发送的文件大得多)。在服务方法返回byte []之前,我将该byte []输出到服务端的磁盘上,并创建了文件...这指向返回byte []的方法和我的客户端之间的错误从客户端上的一个流重建的byte [] ...重建从流中的byte [],我用下面的方法,有人张贴在过去的计算器:

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

你可以发布你的服务的骨架和服务配置文件的配置吗? – Rajesh 2012-01-18 10:19:23

回答

1

我想服务器的响应除了原始字节外还包含一些信封。像XML信封或其他东西。当然,假设在响应中字节为base64编码字符串,因为您不能将二进制数据存储到XML中。这也可以解释为什么你在客户端获得比服务器发送的实际PDF更大的缓冲区。

这当然取决于你的WCF服务使用什么以及它是如何配置的。当您转储MemoryStream的内容时,您正在客户端读取什么内容?这应该为您提供关于如何在HTTP响应正文中编码实际PDF文件的进一步提示。

+0

谢谢,这很有道理达林。我目前无法访问代码,但我可以告诉你从服务发送的原始文件是20MB,但是当我将Stream转储到客户端磁盘上的文件时,生成的文件大小为〜 70MB。一个信封能够真的为文件添加那么多的大小吗?如果这是问题,我如何才能提取原始字节并忽略返回流的不相关部分? – DotNetDeveloper 2012-01-17 22:26:08

+0

@DotNetDeveloper,如果没有你先告诉你有关这个服务使用的确切绑定的更多细节,或者至少抛弃实际的响应,我不能回答这个问题。但是,是的,它看起来像一个包含PDF文件的Base64编码字节的信封。 – 2012-01-17 22:28:27

+0

嗨达林和Rajesh。对延迟响应抱歉。仔细研究了这个之后,我发现默认情况下WCF服务被配置为在json中返回响应。这就解释了为什么返回的响应如此之大,它是一个字节数组,在一个大的json字符串中被序列化。所以看起来你是对的Darin,从某种意义上说服务是将原始字节包装成某种格式...... – DotNetDeveloper 2012-01-18 21:06:51