我目前正在使用此代码来了解文件下载的最后一块是否已发送,并且它有效,但不是一个好的设计,因此寻找更好的选项:
Response.ClearHeaders()
Response.ClearContent()
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment;filename=""WebInstall.exe""")
Response.BufferOutput = False
Response.AddHeader("Content-Length", bytes.Length())
Dim bytesSent As Integer = 0
Do While Response.IsClientConnected And (bytesSent < bytes.Length())
Dim len As Integer
Dim bytesLeft As Integer = bytes.Length() - bytesSent
If bytesLeft > 80 * 1024 Then
len = 80 * 1024
Else
len = bytesLeft
End If
Response.OutputStream.Write(bytes, bytesSent, len)
Response.OutputStream.Flush()
bytesSent += len
Loop
If Response.IsClientConnected Then
AddToWebLog("Download completed")
NotifyAdProvider()
Else
AddToWebLog("Disconnected before download completed")
End If
Response.End()
上面代码的问题是我的ASP.NET代码在写入最后一个下载块之前无法返回到IIS。那些使用ASP.NET的人知道为什么这是一个糟糕的设计 - 除了其他原因之外,它还包含少数可用的工作线程之一。
我需要知道此信息用于记录,并且还要向向我发送访问者的人付费,因此这非常重要(15%的访问者实际上没有下载,可能是因为他们从浏览器获得的警告,反...病毒等等 - 所以我不想多支付15%的费用,我的广告提供商也不错。)
IIS有此信息,因为如果连接在完成之前关闭,则IIS日志的状态代码为“64”。因此,当请求“完成”或者你们可能已经使用过的其他一些强大的方法时,寻找一种让IIS再次给我打电话的方法,可能是访问IIS日志或其他东西的API(读取文件本身可能不起作用,因为它是缓存的,不会马上写入)。我已经看到一些ASP.NET页面的异步方法需要执行“长时间运行的任务”,但它们看起来非常复杂,所以我将它保存为最后的手段。
我正在使用ASP.NET 3.5和IIS 6.
答案 0 :(得分:0)
我读到的关于pageasyntask的内容越多,它实际上看起来并不太糟糕。我认为使用BeginWrite将是最佳选择。