Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让IIS在发送最后一块文件下载时通知ASP.NET_Asp.net_Iis 6_Download - Fatal编程技术网

让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事件添加到日志之前触发了该事件,则可能会起作用,但似乎没有。我不知道该方法的具体内容,但是的,异步是您希望采用的方式。