HTML appending/replacing contents of downloaded file

蓝咒 提交于 2020-01-25 00:30:36

问题


This is puzzling me greatly as the code works in development environment and deployed to IIS locally. However when deployed onto our test server the contents of a plain text download is replaced with the page postback. The code to generate;

Protected Sub _uiDownloadLBtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _uiDownloadLBtn.Click
    Try
        'respond with the export details
        RespondWithFile(ExportFilePath)

    Catch ex As Exception
        'log the exception
        _logger.ErrorException("There was a problem trying to download the export file", ex)
        lblMessage.Text = "There was a problem trying to download the file"
    End Try
End Sub

Public Sub RespondWithFile(ByVal fileName As String)
    RespondWithFile(fileName, fileName)
End Sub

Public Sub RespondWithFile(ByVal fileName As String, ByVal downloadFileName As String)
    Try
        ' don't do anything if we have nothing to work with
        If String.IsNullOrEmpty(fileName) OrElse Not File.Exists(fileName) Then
            Return
        End If

        Dim fileDetails As New FileInfo(fileName)
        Dim response As HttpResponse = HttpContext.Current.Response
        response.Clear()
        response.AddHeader("Content-Disposition", "attachment; filename=" & Path.GetFileName(downloadFileName))
        ' strip out the path
        response.AddHeader("Content-Length", fileDetails.Length.ToString())
        response.ContentType = "text/plain"
        response.WriteFile(fileName)
        'response.End()
        HttpContext.Current.ApplicationInstance.CompleteRequest()

    Catch tex As ThreadAbortException
        ' log as warning and stop it from bubbling back up the call stack
        _logger.WarnException("ThreadAbortException thrown", tex)
        Thread.ResetAbort()
    End Try
End Sub

As you can see, I am explicitly specifying the MIME type to text/plain and I have tried calling both response.End() and HttpContext.Current.ApplicationInstance.CompleteRequest().

The original behaviour was that the contents of the file were being transmitted followed by a blank line and then the postback. After completly wiping the deployed contents and copying the updated code onto the IIS server the postback contents were then replacing the download contents.

Logically the place to look would be the IIS instance but the application uses only the most basic of settings. IIS version is 7 and .NET framework is 2.0. No other IIS configuration was set.

Ideas?


回答1:


I found "a" solution. By chaning the content type to "application/pdf" and the file extension to ".csv" I was able to force the content delivery of the file be seperated from the postback content. This works across browsers though does have an unfortunate effect in FireFox which asks the user to open the text file using Adobe Reader (the registered application for "application/pdf" content). This doesn't matter for our customer but may not be an option for others.

This does tie the cause down quite firmly in the MIME configuration in IIS though I'm still left puzzled as to the exact setting causing it. I had tried explicitly setting up ".txt" as text/plain and ".csv" as text/csv (a valid but usually unregistered MIME type) and neither worked. I wonder if there's some kind of MIME type heirarchy/preference at play here.

Still, at least there's a viable solution. I hope this helps others.



来源:https://stackoverflow.com/questions/17706689/html-appending-replacing-contents-of-downloaded-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!