.net IHTTPHandler Потоковая передача двоичных данных SQL - PullRequest
0 голосов
/ 30 мая 2010

Я пытаюсь реализовать ihttphandeler для потоковой передачи файлов. файлы могут быть крошечными миниатюрами или гигантскими фильмами
бинарные файлы хранятся на сервере sql
я посмотрел много кода онлайн, но что-то не имеет смысла
разве потоковое не должно считывать данные по частям и перемещать их по строке?
большая часть кода, кажется, сначала читает все поле из 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

конец использования конец использования конец суб

обратите внимание, что эта команда sql также возвращает расширение файла (pdf, jpg, doc ...) во втором поле запроса

большое спасибо всем

РЕДАКТИРОВАТЬ:

Мне удалось найти еще немного кода, и теперь страница периодически появляется. иногда он приносит файл PDF, а иногда нет
я не могу понять образец здесь
Я думаю, что основная проблема заключается в том, что когда запрос сделан с другой страницы, и я нажимаю «показать в новой вкладке», тогда он никогда не работал. когда я делаю «показать в новом окне», это в основном работает, но не всегда.
Кстати. код ВСЕГДА работает. никогда не ломается или ошибки или что-то в этом роде. он работает как хороший мальчик от начала до конца при каждом запросе
иногда через долгое время IE выдает мне сообщение (из новой вкладки): «Проблема с Adobe / Acrobat Reader. Пожалуйста, выйдите из 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

большое спасибо

1 Ответ

0 голосов
/ 29 ноября 2010

перерыв прекратился. не знаю почему.

но теперь работает нормально

...