11

FileStreamResultを使用して、SilverlightMediaElementベースのビデオプレーヤーにビデオデータを提供しています。

public ActionResult Preview(Guid id) {
    return new FileStreamResult(
        Services.AssetStore.GetStream(id, ContentType.Preview),
        "application/octet-stream");
}

残念ながら、Silverlightビデオプレーヤーは、再生を開始する前にビデオファイル全体をダウンロードします。Previewアクションは部分的なコンテンツのダウンロードをサポートしていないため、この動作は予想されます。

(補足:ファイルがIIS仮想ディレクトリでホストされている場合、ダウンロード中にビデオの任意の場所で再生を開始できます。ただし、セキュリティと監査の理由から、直接ダウンロードリンクを提供することはできません。したがって、これはそうではありません。オプション。)

部分的なHTTPコンテンツをサポートするようにコントローラーアクションをどのように改善できますか?

最初にサポートしていることをクライアントに通知する必要があると思います(HEADリクエストに「Accept-Ranges:bytes」ヘッダーを追加します)。次に、HTTP「Range」ヘッダーを評価し、リクエストされたファイル範囲を応答でストリーミングする必要があります。コード206。IIS6でホストされているASP.NETMVCで機能しますか?すでに利用可能なコードはありますか?

以下も参照してください。

4

3 に答える 3

5

この正確な機能を提供するCodePlexのプロジェクトがあります。

http://mediastreamingmvc.codeplex.com/

見てください。これは、仮想リソースの要求を表すアクションを作成し、要求された場合に開発者がそれをサポートするために多くのことを行う必要なしに部分的なコンテンツを返すというこのシナリオのために特別に作成されました(アクションフィルターと結果タイプの選択)。

于 2010-11-16T23:20:51.103 に答える
0
  1. これは自分で実装する必要があります。はい、これはIIS6で機能します。
  2. IIS7を使用できる場合は、IIS7の拡張性を活用する方がよいでしょう()。
于 2009-07-21T09:04:32.850 に答える
-2

次に、スロットルモジュールを再実装する必要があります:)

アイデアは、ビデオストリームのビットレートを計算し、必要なだけクライアントに送信することです。したがって、ストリームからブロックを読み取り、それをクライアントに送信して1秒間スリープする必要があります(ごく簡単に)。

Thread.Sleep(1000)は、IISリソースを処理するための良いアイデアではないため、非同期で処理する必要があります。IAsyncResultがあなたの友達になります。

あらゆる種類の最適化の余地がたくさんあります。

そして最後に...MVCActionResultとしてではなく、プレーンなhttphandlerとして機能するようにしました。Webisteで可能であれば、ハンドラーとして実行することをお勧めします。

于 2009-07-21T11:03:52.873 に答える