Пусть IIS уведомит ASP.NET, когда последний фрагмент загруженного файла отправлен - PullRequest
3 голосов
/ 23 февраля 2012

В настоящее время я использую этот код, чтобы узнать, был ли отправлен последний фрагмент загруженного файла или нет, и он работает, но не очень хороший дизайн, поэтому ищите лучшие варианты:

    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.

1 Ответ

0 голосов
/ 23 февраля 2012

Чем больше я читаю о Pageasyntask, на самом деле все выглядит не так уж плохо. Я думаю, что использование BeginWrite будет способом пойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...