2012-01-17 162 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