2012-01-17 7 views
1

私はRESTful WCFサービスを使用しています。サービスメソッドの1つがbyte [](ファイルを含む)を返します。安心なWCFサービス - バイト[]を返すか?

クライアント側では、特定のサービスメソッドを呼び出すためにWebRequestクラスを使用するコードがあります。 WebRequestクラスを使用して、私は次のように応答ストリームを取得しています:このストリームから

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

、私はその後、バイト[]を再構築して、ローカルファイルを出力しています。問題は、クライアント側の再構築ファイルがサービス側から返されたファイルに似ていないことです(サービス側から送信されたものよりもサイズがはるかに大きい破損したPDFファイルが取得されます)。サービスメソッドがバイト[]を返す直前に、サービス側のディスクにそのバイト[]を出力し、ファイルを正常に作成しました...これは、バイト[]とクライアント側を返すそのメソッド間で何か問題があることを示します

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();  
    } 
} 

任意のアイデア:ストリームからバイト[]を再構築するために...クライアント側でストリームからバイト[]を再構築する、私は誰かがstackoverflowの上、過去に投稿された以下の方法を使用しています何がうまくいかないだろうか?

+0

サービスのスケルトンとその設定をサービスの設定ファイルから投稿できますか? – Rajesh

答えて

1

私は、サーバーからの応答に生のバイトに加えていくつかのエンベロープが含まれていると思います。 XMLエンベロープのようなもの。もちろん、バイナリデータをXMLに格納することができないため、バイトはbase64エンコードされた文字列であると想定します。また、サーバーが送信した実際のPDFよりも大きなバッファーをクライアント上で取得する理由も説明します。

これはもちろん、WCFサービスが使用するバインディングとその構成方法によって異なります。 MemoryStreamの内容をダンプすると、あなたはクライアントに何を表示しているのですか?これにより、実際のP​​DFファイルがHTTPレスポンス本文にどのようにエンコードされているかについてのヒントが得られます。

+0

ありがとう、それはダーリンを意味する。私は現在コードにアクセスできないが、サービスから送られてきた元のファイルは20MBだと言うことができるが、ストリームをクライアント側のディスク上のファイルにダンプすると、ファイルサイズは〜 70MB。エンベロープは本当にファイルにそれほど大きなサイズを追加できますか?これが問題ならば、どうやって生のバイトだけを抽出し、返されたストリームの関連しない部分は無視することができますか? – DotNetDeveloper

+0

@DotNetDeveloperでは、このサービスが使用する正確なバインディングの詳細や実際の応答を少なくともダンプすることなく、まずこの質問に答えることはできません。しかし、ええ、それはPDFファイルのBase64でエンコードされたバイトを含むエンベロープのように見えます。 –

+0

こんにちはDarinとRajesh。遅れた応答に対する謝罪。これを詳しく調べたところ、WCFサービスはデフォルトでjsonで応答を返すように構成されていました。これは、返される応答が大きかった理由を説明しています。大きなjson文字列にシリアル化されたバイト配列でした。だから、あなたはダーリンが正しいと思われます。その意味では、サービスは生のバイトを何らかのフォーマットにラップしていました... – DotNetDeveloper

関連する問題