2011-07-01 5 views
3

私は、Webサービスから大量のデータを転送する必要があります。メタベースのIISバッファサイズを増やすのではなく、バッファされていないResponse.OutputStreamにバイトを直接ポンピングしたいと思います。ByteをResponse.OutputStreamに直接ポンピングする - バイト数を処理する方法?

Response.ClearHeaders(); 
Response.Clear(); 
Response.ContentType = "text/xml"; 
Response.Buffer = false; 
int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream); 
Response.End(); 

これは正常に動作しますが、私はそれらだけを取り出す後を取得されたバイト数を知ることができるので、私はん。ContentLengthヘッダーを設定することはできません。

int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream); 
Response.AddHeader("Content-Length", len.ToString()); // can't do this 

質問:私は本当に多くのオプションが存在しないと思います次の行は、例外を(あなたがコンテンツを返す開始した後にヘッダを追加することはできません)スローします。これを処理する唯一の方法は、メモリストリームなどの中間ストリームを導入し、ストリームの長さを取得し、ヘッダを設定してからそのストリームをResponse.Outputストリームにポンピングすることです。他のアイデアは?

+0

この機能を変更できますか? – SLaks

+0

はい、機能を変更できます。 – Brett

答えて

4

content-lengthは必須ではありません。レスポンスストリームにコンテンツを送信する前に合法的にそれを知らない場合は、それを放置しておいてください。ブラウザは結果を表示しますが、進行状況バーまたは完了率を表示することはできません。コンテンツが小さい場合、これは大きな懸念事項ではありません。 HTTPで

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13

メッセージの長さは、前

を転送中に判定することができるときはいつでも、それが送信されるべきであるべきでありてはいけませんだとなります。

+0

ありがとうございます。この場合、事前に内容をバッファして決定する方法はありません。私はWebサービスコールでそれを処理する必要があります。私はコンテンツが正常に転送されることを知っていた。私は何かを逃していないことを確かめたかった。 – Brett

0

データを書き込む前に長さを与えるように関数を変更する必要があります。

たとえば、コールバックをAction<long>にしてから、ストリームに書き込む前にその長さのコールバックを呼び出すことができます。
あなたのページは、length => Response.AddHeader("Content-Length", length.ToString())をコールバックとして渡すことができます。

+0

2番目のストリームを導入する必要があります。 Response.OutputStreamをフラッシュせずに入力することはできません。あなたが行くときにそれをフラッシュすることに失敗すると、OutOfMemory例外が発生します。そして、それをフラッシュすることによって、ヘッダーを書くことはできません。おそらく、私は質問してはいけません...第二のストリームは本当に唯一の選択肢だと私は思います。 – Brett

+0

@ブレット:あなたは私の答えを誤解しています。ストリームへの書き込みを開始する前に 'Action 'を呼び出すことができます。 – SLaks

+0

不確定なサイズのデータ​​ソース(データベースのレコード)がある場合、データを読み込まずに長さを書き込む方法はありますか?あなたはそれを読んでどこかにデータを置く必要があります。最も効率的な場所は、Response.OutputStreamに配置することです。しかし、OutofMemory例外を避けるためには、定期的なフラッシュが必要です。 – Brett

関連する問題