运行 Response.End() 之后的代码及其替代方案

Running Code After Response.End() and Alternatives for it

我正在将代码导出到 csv 文件,进程按预期以 Response.End() 终止,Finally 子句中的 SendEmail 例程从未执行。我需要在 Response.End 之后 运行 SendEmail() 并寻求建议。如果只是删除 Response.End,则永远不会创建 csv 文件。

 Protected Sub ExportExcel(ByVal Vendor As String)
    Dim MyConnection As SqlConnection
    MyConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("BusOpsConnectionString").ConnectionString)
    Dim cmd As New SqlCommand("p_BPOTracker_ClosedReport", MyConnection)
    With cmd
        .CommandType = CommandType.StoredProcedure

        cmd.Parameters.AddWithValue("@Vendor", SqlDbType.VarChar).Value = Vendor
        cmd.Parameters.AddWithValue("@IssueStatus", SqlDbType.VarChar).Value = "Closed"

    End With

    Dim da As New SqlDataAdapter(cmd)
    Dim myDataTable As DataTable = New DataTable()
    da.Fill(myDataTable)

    Dim FileDate As String = Replace(FormatDateTime(Now(), DateFormat.ShortDate), "/", "")
    Dim attachmentName As String = "BPOTracker_Closed_Report_" & Vendor & "_" & FileDate & "_.csv"

    Try
        MyConnection.Open()
        Response.Clear()
        Response.ClearHeaders()
        Dim writer As New CsvWriter(Response.OutputStream, ","c, Encoding.Default)
        writer.WriteAll(myDataTable, True)
        writer.Close()

        Response.AddHeader("Content-Disposition", "attachment;filename=" & attachmentName)
        Response.ContentType = "application/vnd.ms-excel"
        Response.End()

    Finally

        If MyConnection.State <> ConnectionState.Closed Then MyConnection.Close()
        MyConnection.Dispose()
        MyConnection = Nothing
        myDataTable.Dispose()
        myDataTable = Nothing

        Thread.Sleep(3000)
        SendEmail(Vendor, attachmentName)

    End Try

End Sub

Sub SendEmail(ByVal Vendor As String, ByVal attachmentFileName As String)
'Send Email
End Sub

这里问题的根源在于您没有明确的方法来获取生成的文件作为文件的附件。您的 CSVWriter 正在直接写入 HTTP 响应。相反,您可以写入磁盘上的文件位置或内存。届时,您可以将文件作为附件发送给电子邮件。然后就可以把文件写入response,然后结束response了。

您的方法可以使用更多的细分。我建议一种生成文件的方法,一种将文件发送到电子邮件的方法(您已经收到了),另一种将文件写入响应的方法。