2017-06-08 3 views
2

私のようなAddRange機能では、HttpWebRequestを使用しています:C#でファイルをセグメント単位でダウンロードするにはどうすればよいですか?

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL); 
myHttpWebRequest.AddRange(20, 30); 
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
Stream streamResponse = myHttpWebResponse.GetResponseStream(); 
SaveFileStream(name, streamResponse); //save file function 

...しかし、ファイル全体をダウンロードしました。上記のコードで

AddRange()は、20と30の間のバイトは、(ファイルからこれらの10のバイトをダウンロードするために、他の言葉で)ダウンロードされることを期待します。

ダウンロードがセグメント化されていないので、私のコードは機能しません。このリンクは例を提供します:http://stackoverflow.com/robots.txtそのファイルは完全にダウンロードされました。どうして?

+0

を使用して、[このMSDNのサンプルのように]、その内容を確認するためにそれを実行する前に要求ヘッダーを出力する試みている(https://msdn.microsoft.com/en-us/library/7fy67z6d(V = vs.110 ).aspx#例)? –

答えて

0

HTTPサーバはRangeヘッダ要求をサポートする必要はありません。 HEADリクエストを発行し、Accept-Rangesヘッダの値をチェックすることで、サーバの範囲サポートを確認できます(HTTP range requests参照)。しかしこれは、サーバがRangeヘッダを無視しないことを保証するものではありません(特に、HTTPサーバがそのような小さなセグメントにコンテンツを提供することは非常に非効率的です)。 RFC7233から

サーバは範囲を無視するのは自由ですので、多くの実装が 単純に200(OK) 応じて全体の選択の表現で応答します。ほとんどのクライアントは、クライアントが、彼らは完全な表現を受け取った まで、無効な部分要求を行って停止しない可能性があるため(以下、効率的とはいえ)タスクを完了し、一部 する 200(OK)を受信する用意があるので、それは一部です。したがって、クライアントは が最も適切であっても416(Range Not Satisfiable)応答を受信することに依存することはできません。

サーバーがRangeヘッダーを受け入れるか無視するかを判断するには、応答ステータスコードを確認する必要があります。 200 (OK)206 (Partial Content)ヘッダで指定された範囲は、サーバによって返されたと​​が要求された範囲のセットが無効な範囲または小さなまたは重複範囲の過剰な要求に拒否されたことを示すことを示し、サーバはRangeヘッダを無視して、全体の応答体を返したことを示しています。 http://stackoverflow.com/robots.txtの場合

は、サーバはHEAD要求に応答してAccept-Ranges: bytesヘッダを返すことによってRangeヘッダのサポートを示しているが、指定AddRange(20、30)とGET要求に、応答は200 (OK)ので、サーバは、まさにそのような小さい範囲Aを無視します返信本体全体を返しました。必要に応じて、あなた自身が応答からリクエストされた範囲を切り取らなければなりません。

関連する問題