В настоящее время я использую этот код, чтобы узнать, был ли отправлен последний фрагмент загруженного файла или нет, и он работает, но не очень хороший дизайн, поэтому ищите лучшие варианты:
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 снова вызывал меня, когда запрос «сделан», или какие-то другие надежные методы, которые вы, ребята, могли бы использовать, например, API для доступа к журналу IIS или что-то подобное (чтение самого файла, вероятно, не будет работать,поскольку он кэшируется и не записывается сразу).Я видел несколько асинхронных методов для страниц ASP.NET, которые должны выполнять «долго выполняющиеся задачи», но они кажутся очень сложными, поэтому я сохраняю это как последнее средство.
Я использую ASP.NET 3.5и IIS 6.