让IIS在发送最后一块文件下载时通知ASP.NET
我目前正在使用此代码来了解文件下载的最后一块是否已发送,它可以工作,但不是一个好的设计,因此寻找更好的选项:让IIS在发送最后一块文件下载时通知ASP.NET,asp.net,iis-6,download,Asp.net,Iis 6,Download,我目前正在使用此代码来了解文件下载的最后一块是否已发送,它可以工作,但不是一个好的设计,因此寻找更好的选项: Response.ClearHeaders() Response.ClearContent() Response.Clear() Response.ContentType = "application/octet-stream" Response.AddHeader("Content-Disposition", "attachment;filena
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()
Response.ClearHeaders()
Response.ClearContent()
答复:Clear()
Response.ContentType=“应用程序/八位字节流”
Response.AddHeader(“内容处置”、“附件;文件名=”“WebInstall.exe”“”)
Response.BufferOutput=False
Response.AddHeader(“内容长度”,bytes.Length())
Dim bytesSent作为整数=0
执行While Response.IsClientConnected和(bytesSent80*1024,则
len=80*1024
其他的
len=字节左
如果结束
Response.OutputStream.Write(字节、字节、len)
Response.OutputStream.Flush()
bytesSent+=len
环
如果Response.IsClientConnected,则
AddTowerBlog(“下载完成”)
NotifyAdProvider()
其他的
AddTowerBlog(“下载完成前断开连接”)
如果结束
答复:End()
上面代码的问题是,我的ASP.NET代码无法返回到IIS,直到最后一段下载被写入。使用ASP.NET的人都知道为什么这是一个糟糕的设计——除了其他原因外,它还占用了为数不多的可用工作线程之一
我需要知道这些信息来记录日志,还需要支付给给我访问者的人的费用,所以这一点非常重要(15%的访问者实际上没有下载,可能是因为他们从浏览器、防病毒等处收到警告——所以我不想额外支付15%,我的广告提供商对此没有意见)
IIS具有此信息,因为如果连接在完成之前已关闭,则IIS日志的状态代码为“64”。因此,寻找一种方法,让IIS在请求“完成”时再次调用我,或者其他一些你们可能使用过的健壮方法,可能是访问IIS日志的API或其他东西(读取文件本身可能不起作用,因为它是缓存的,不会立即写入)。我见过一些用于ASP.NET页面的异步方法,这些方法需要执行“长时间运行的任务”,但它们看起来非常复杂,所以我将保存它们作为最后手段
我正在使用ASP.NET 3.5和IIS 6。我读到的关于pageasyntask的内容越多,它看起来其实并不太糟糕。我认为使用BeginWrite将是一个不错的选择。也许这会有所帮助:谢谢,但我希望有比日志解析更实时的东西。如果IIS在将ASP.NET事件添加到日志之前触发了该事件,则可能会起作用,但似乎没有。我不知道该方法的具体内容,但是的,异步是您希望采用的方式。