ローカル DB からビデオをストリーミングすることを目的としたアプリケーションがあります。昨日、データを aRangeFileContentResult
またはRangeFileStreamResult
成功せずに返そうとするのに多くの時間を費やしました。
つまり、これら 2 つの結果のいずれかとしてファイルを返すと、ビデオを正しくストリーミング (またはまったく再生) できないようです。
ブラウザからのリクエストは、次のヘッダーとともに送信されます。
Range: bytes=0-
応答が提供され、例としてこれらのヘッダーが提供されます。
Accept-Ranges: bytes
Content-Range: bytes 0-5103295/5103296
ネットワーク トラフィックに関しては、部分的な結果に対して一連の 206 を取得し、最後に (フィドラーによると) 200 を取得しますが、これは正しいようです。Chrome のネットワーク タブはこれに同意せず、最初のリクエスト (常に 13 バイトで、これはハンドシェイクであると想定しています) に続いて、ステータスがキャンセルまたは保留になっているいくつかのリクエストが表示されます。私が理解している限り、これは多かれ少なかれ正しい、206 - キャンセル、206 - キャンセルなどですが、ビデオは再生されません。
結果をコントローラーから FileResult に切り替えると、ビデオが再生され、ダウンロードが完了する前に Chrome、IE10、および Firefox が再生を開始するように見えます (ストリーミングしているように少し感じますが、そうではないのではないかと思います)。
しかし、範囲の結果では、クロムまたはIEでは何も得られず、ビデオ全体がFirefoxで1回のドロップでダウンロードされます。
私が理解している限り、RangeFileContentResult
ダウンロードするバイトの範囲でクライアントへの応答を処理する必要があります(私の場合はそうではないようです。ファイル全体を取得するように指示するだけです(上記の応答で示されています))。そして、クライアントはそれに応答する必要がありますが、そうではないようです。
この分野で何か考えている人はいますか?具体的には:
a)RangeFileContentResult
ある範囲のバイトをクライアントに送り返す必要がありますか? b) クライアント側から要求されたバイトの範囲を明示的に制御する方法はありますか? c) をリクエストしたときにブラウザがビデオをまったくロードしない原因となる、ここで私が間違っている理由や何かがありますRangeFileContentResult
か?
編集:私が見ているものを説明するのに役立つ図を追加しました:
EDIT2:わかりました、プロットが厚くなります。RangedFile ガビンで遊んでいる間に、別のシステム テスト バージョンをプッシュする必要があり、以下のようにコントローラー アクションに「RangeFileContentResult」を残しました。
private ActionResult RetrieveVideo(MediaItem media)
{
return new RangeFileContentResult(
media.Content,
media.MimeType,
media.Id.ToString(),
DateTime.Now);
}
奇妙なことに、これは現在、Azure システム テスト環境では期待どおりに機能しているように見えますが、ローカル マシンではまだ機能していません。Azures IIS8 では問題なく動作するが、私のローカル 7.5 インスタンスでは動作しない IIS ベースの何かがあるのだろうか?