0

ストリーミング ファイル用に ihttphandeler を実装しようとしています。ファイルは小さなサムネイルまたは巨大なムービーかもしれません
バイナリはSQLサーバーに保存されています
私はオンラインでたくさんのコードを見ましたが、何かが意味をなさない
のはストリーミングではなく、データを1つずつ読み取って行を移動することになっていますか?
ほとんどのコードは、最初に mssql からメモリにフィールド全体を読み取ってから、出力書き込みにストリーミングを使用するようです。
実際にディスクからバイト単位で http に直接ストリーミングする方が効率的ではないでしょうか (またはバッファリングされたチャンクでしょうか?)
、ここに私のコードがあります。これまでのところ、sqlreader モードとストリーム オブジェクトと書記体系の正しい組み合わせがわかりません。

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
     context.Response.BufferOutput = False
    Dim FileField=safeparam(context.Request.QueryString("FileField"))
     Dim FileTable=safeparam(context.Request.QueryString("FileTable"))
     Dim KeyField=safeparam(context.Request.QueryString("KeyField"))
     Dim FileKey=safeparam(context.Request.QueryString("FileKey"))                 
    Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("Main").ConnectionString)
        Using command As New SqlCommand("SELECT " & FileField & "Bytes," & FileField & "Type FROM " & FileTable & " WHERE " & KeyField & "=" & FileKey, connection)
            command.CommandType = Data.CommandType.Text

end using end sub を使用して終了

この sql コマンドは、クエリの 2 番目のフィールドにファイル拡張子 (pdf、jpg、doc...) も返すことに注意してください。

どうもありがとうございました

編集:

さらにコードを見つけることができたので、ページが断続的に表示されるようになりました。
ここでパターンを理解できない場合があり
ます。主な問題は、リクエストが別のページからのもので、「新しいタブに表示」をクリックした場合に発生すると思いますが、機能しませんでした。「新しいウィンドウで表示」を行うと、ほとんどの場合機能しますが、常に機能するとは限りません。
ところで。コードは常に実行されます。壊れたりエラーになったりすることはありません。要求ごとに最初から最後までいい子のように実行される
ことがある IE が長い間、(新しいタブから) 「Adobe/Acrobat リーダーに問題があります。Adobe Acrobat/Reader を終了してからやり直してください」というメッセージが表示されることがあります."
問題は何でしょうか?
ここに私の現在のコードがあります

Shared Sub ProccessMedia(ByVal context As HttpContext)
    If CurPerson Is Nothing OrElse Not CurPerson.PersonExts.FirstOrDefault.LetAllFiles Then Exit Sub
    context.Response.BufferOutput = False
    Dim FileField = SafeParam(context.Request.QueryString("FileField"))
    Dim FileTable = SafeParam(context.Request.QueryString("FileTable"))
    Dim KeyField = SafeParam(context.Request.QueryString("KeyField"))
    Dim FileKey = SafeParam(context.Request.QueryString("FileKey"))
    Dim oSqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("Main").ConnectionString)
    Dim oSqlCommand = New SqlCommand("SELECT " & FileField & "Type," & FileField & "Bytes FROM " & FileTable & " WHERE " & KeyField & "=" & FileKey, oSqlConnection)
    oSqlConnection.Open()
    Dim oSqlDataReader = oSqlCommand.ExecuteReader(CommandBehavior.SequentialAccess)
    If oSqlDataReader.Read() Then
        context.Response.ContentType = GetMIMEType(oSqlDataReader.GetString(0))
        Dim bufferSize = 8040
        Dim chunk = New Byte(bufferSize - 1) {}
        Dim retCount As Long
        Dim startIndex As Long = 0
        retCount = oSqlDataReader.GetBytes(1, startIndex, chunk, 0, bufferSize)
        While retCount = bufferSize
            context.Response.BinaryWrite(chunk)
            startIndex += bufferSize
            retCount = oSqlDataReader.GetBytes(1, startIndex, chunk, 0, bufferSize)
        End While
        oSqlDataReader.Close()
        oSqlConnection.Close()
        Dim actualChunk = New Byte(retCount - 2) {}
        Buffer.BlockCopy(chunk, 0, actualChunk, 0, CInt(retCount) - 1)
        context.Response.BinaryWrite(actualChunk)
    End If
End Sub

どうもありがとうございます

4

1 に答える 1

0

間欠が止まりました。理由がわからない。

しかし、今は問題なく動作しています

于 2010-11-29T16:04:31.110 に答える