运行 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了。
您的方法可以使用更多的细分。我建议一种生成文件的方法,一种将文件发送到电子邮件的方法(您已经收到了),另一种将文件写入响应的方法。
我正在将代码导出到 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了。
您的方法可以使用更多的细分。我建议一种生成文件的方法,一种将文件发送到电子邮件的方法(您已经收到了),另一种将文件写入响应的方法。