ASP.net c # частичный запрос на получение - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть обработчик, который работает так, как должен обслуживать загрузку. Это важный код:

    // Get size of file
    FileInfo f = new FileInfo(Settings.ReleaseFileLocation + ActualFileName);
    long FileSize = f.Length;

    // Init (returns ID of tblDownloadLog record created with blank end date)
    int DownloadRecordID = Constructor.VersionReleaseDownload.newReleaseDownload(ActualFileName);

    context.Response.Clear();
    context.Response.Buffer = false;        
    context.Response.ContentType = "application/octet-stream";
    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + OriginalFileName);
    context.Response.AddHeader("Content-Length", FileSize.ToString());
    context.Response.TransmitFile(Settings.ReleaseFileLocation + ActualFileName);
    context.Response.Close();               

    // Complete download log, fills out the end date
    Constructor.VersionReleaseDownload.completeReleaseDownload(DownloadRecordID);

context.Response.Close(); гарантирует, что completeReleaseDownload() запускается только после завершения загрузки, что очень полезно (re Считайте загрузку только после ее подачи )

Проблема в том, что мы получаем много журналов, которые приходят с одного и того же IP-адреса примерно за один промежуток времени. После более глубокого изучения выясняется, что это пользователи, использующие ПО Download Resumer.

Когда я пытаюсь использовать возобновление загрузки, кажется, что это не удается. Мой вопрос:

  • Как мне обнаружить это частичный запрос
  • Как я могу удовлетворить частичный запрос
  • Как я могу заставить его работать с приведенным выше кодом, чтобы он a) Вызывал https://www.scirra.com/downloads/releases/construct2-r68-setup_4.exe при первом частичном получении и b) Вызывал completeReleaseDownload при последнем частичном получении?

1 Ответ

2 голосов
/ 17 ноября 2011

Это достигается в Mime с помощью E-Tag, проверьте: http://www.devx.com/dotnet/Article/22533/1954

Когда вы перехватываете некоторые пакеты, отправленные с использованием DownloadResumer, вы, вероятно, обнаружите, что тег Rangeуказано.

Range: bytes=500-1000

Это позволяет вам проверить, является ли это частичным запросом, и если это так, выполнить действие, например:

bool isFirstRequest = RangeStart == 0;
bool isLastRequest =  RangeEnd  ==  file.TotalBytes - 1;//(Ranges use Zero-Based Indices)
...