1

コードが開発環境で動作し、IIS にローカルに展開されているため、これは非常に困惑しています。ただし、テスト サーバーに展開すると、プレーン テキストのダウンロードのコンテンツがページのポストバックに置き換えられます。生成するコード。

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

ご覧のとおり、MIME タイプを明示的に に指定してtext/plainおり、 と の両方response.End()を呼び出してみHttpContext.Current.ApplicationInstance.CompleteRequest()ました。

元の動作は、ファイルの内容が送信され、その後に空白行が続き、その後にポストバックされるというものでした。デプロイされたコンテンツを完全に消去し、更新されたコードを IIS サーバーにコピーした後、ポストバック コンテンツがダウンロード コンテンツを置き換えていました。

論理的に見るべき場所は IIS インスタンスですが、アプリケーションは最も基本的な設定のみを使用します。IIS のバージョンは 7 で、.NET フレームワークは 2.0 です。他の IIS 構成は設定されていません。

アイデア?

4

1 に答える 1

0

私は「解決策」を見つけました。コンテンツ タイプを に変更"application/pdf"し、ファイル拡張子を".csv"に変更することで、ファイルのコンテンツ配信をポストバック コンテンツから強制的に分離することができました。これはブラウザー間で機能しますが、FireFox では不幸な影響があり、ユーザーは Adob​​e Reader (「application/pdf」コンテンツ用に登録されたアプリケーション) を使用してテキスト ファイルを開くように求められます。これは当社のお客様にとっては問題ではありませんが、他のお客様にとっては選択肢にならない場合があります。

これは、原因を IIS の MIME 構成にしっかりと結び付けますが、原因となっている正確な設定についてはまだ困惑しています。".txt"astext/plain".csv"as text/csv(有効だが通常は登録されていない MIME タイプ) を明示的に設定しようとしましたが、どちらも機能しませんでした。ここで、ある種の MIME タイプの階層構造/設定が機能しているのだろうかと思います。

それでも、少なくとも実行可能な解決策があります。これが他の人に役立つことを願っています。

于 2013-07-18T09:44:16.633 に答える