当最后一块文件下载发送时,让IIS通知ASP.NET

时间:2012-02-22 22:35:20

标签: asp.net iis-6 download

我目前正在使用此代码来了解文件下载的最后一块是否已发送,并且它有效,但不是一个好的设计,因此寻找更好的选项:

    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.

1 个答案:

答案 0 :(得分:0)

我读到的关于pageasyntask的内容越多,它实际上看起来并不太糟糕。我认为使用BeginWrite将是最佳选择。