2015-12-11 2 views
0

Мы использовали обработчик файлов IIS для загрузки файлов, хранящихся в базе данных, таких как PowerPoint. Теперь мы пытаемся перейти на webapi. Загрузка файлов работает нормально, но загрузок нет.Vb.net webapi file download troubles

Использование filehandler URL-адрес является как: http://localhost:57851/docmgr?id=6202 который возвращает действительный файл со следующей информацией из Скрипач: filehandler

Используя один и тот же код в контроллере WebAPI имеющим Адрес: http://localhost:57851/webapi/file/GetFile?id=6202 возвращает файл с дополнительным байт. Данные Fiddler: webapi

Обратите внимание на изменение типа контента, даже если тип содержимого явно установлен на «application/vnd.ms-powerpoint».

<HttpGet> 
Public Function GetFile() 
    Dim dbConn As New SqlConnection(DigsConnStr) 
    Dim dbCmd As New SqlCommand 
    Dim dbRdr As SqlDataReader 
    Dim id As String = HttpContext.Current.Request.QueryString("id") 
    Dim bytes As Byte() 
    Dim contentType As String 
    Dim fileName As String 
    Dim fileExt As String 

    Try 
     dbConn.Open() 
     dbCmd.Connection = dbConn 
     dbCmd.CommandText = "GET_FileForDownload" 
     dbCmd.CommandType = CommandType.StoredProcedure 
     dbCmd.Parameters.AddWithValue("@VirtualFileRecID", id) 
     dbRdr = dbCmd.ExecuteReader 
     dbRdr.Read() 
     contentType = dbRdr("ContentType") 
     bytes = dbRdr("FileBytes") 
     fileExt = dbRdr("FileExtension") 
     If contentType <> "" Then 
      fileName = dbRdr("Title") & fileExt 
      HttpContext.Current.Response.ContentType = contentType 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" & fileName) 
      HttpContext.Current.Response.BinaryWrite(bytes) 
      'HttpContext.Current.Response.Flush() 

     End If 
     dbConn.Close() 
    Catch ex As Exception 
     dbConn.Close() 
    Finally 
     If Not (dbConn Is Nothing) Then dbConn.Close() 
    End Try 
End Function 

ответ

2

WebAPI собирается обернуть ваш ответ в XML (или что-то форматировщик вы имеете в своем классе webapiconfig):

Я должен что-то ....

Вот код контроллера отсутствует

вы действительно не должны получить доступ потока ответа непосредственно WebAPI но вы можете вернуть объект HttpResponseMessage с файловым потоком

Проверить это

<HTTPGET> 
Public Function GetFile(FileID as Integer) As HttpResponseMessage 
Dim path = "C:\Temp\test.exe" 
Dim result As New HttpResponseMessage(HttpStatusCode.OK) 
Dim stream = New FileStream(path, FileMode.Open) 

result.Content = New StreamContent(stream) 
result.Content.Headers.ContentType = New MediaTypeHeaderValue("application/octet-stream") 

Return result 
End Function 

Тогда вы действительно должны получить доступ к нему, как это: http://localhost:57851/docmgr/6202

+0

я преобразовал свой код, используя ваше предложение использовать HttpResponseMessage и получить тип содержимого и поток из базы данных, и он прекрасно работает. Большое спасибо! – JoelCool