Фоновая интеллектуальная служба передачи и Amazon S3
Я использую SharpBITS для загрузки файла с AmazonS3.
> // Create new download job. BitsJob
> job = this._bitsManager.CreateJob(jobName, JobType.Download);
> // Add file to job.
> job.AddFile(downloadFile.RemoteUrl, downloadFile.LocalDestination);
> // Resume
> job.Resume();
Это работает для файлов, которые не нуждаются в аутентификации. Однако, как только я добавлю строку запроса аутентификации для запроса файла AmazonS3, ответ от сервера будет http state 403 -unauthorized. URL работает файл в браузере.
Вот HTTP-запрос от службы BIT:
HEAD /mybucket/6a66aeba-0acf-11df-aff6-7d44dc82f95a-000001/5809b987-0f65-11df-9942-f2c504c2c389/v10/summary.doc?AWSAccessKeyId=AAAAZ5SQ76RPQQAAAAA&Expires=1265489615&Signature=VboaRsOCMWWO7VparK3Z0SWE%2FiQ%3D HTTP/1.1
Accept: */*
Accept-Encoding: identity
User-Agent: Microsoft BITS/7.5
Connection: Keep-Alive
Host: s3.amazonaws.com
Единственным отличием от веб-браузера является тип запроса. Firefox отправляет запрос GET, а BITS отправляет запрос HEAD. Есть ли проблемы с запросами Amazon S3 HEAD и проверкой подлинности строки запроса?
С уважением, Blaz
2 ответа
Вы, вероятно, правы, что прокси - единственный способ обойти это. BITS использует запрос HEAD, чтобы получить длину содержимого и решить, хочет ли он разделить загрузку файла. Затем он выполняет запрос GET для фактического получения файла - иногда в целом, если файл достаточно мал, в противном случае с заголовками диапазона.
Если вы можете использовать прокси-сервер или другой трюк, чтобы дать ему какой-либо ответ на запрос HEAD, он должен отклеиться. Даже если запрос HEAD подделан с фиктивной длиной контента, BITS перейдет к GET. В таком случае вы можете увидеть повторяющиеся запросы GET, потому что, если первый запрос GET возвращает длину содержимого, превышающую исходный запрос HEAD, BITS может решить: "О, дерьмо, я все-таки лучше разбить его на части".
Учитывая это, я немного удивлен, что он недостаточно умен, чтобы восстанавливаться после ошибки 403 в запросе HEAD и все же переходить к GET. Каково реальное поведение работы? Вы пробовали смотреть его с помощью битсадмина / монитора? Если задание находится в состоянии временной ошибки, оно может делать это в течение примерно 20 минут, а затем в конечном итоге восстанавливаться.
Перед началом загрузки BITS отправляет запрос HTTP HEAD на сервер, чтобы определить размер удаленного файла, временную метку и т. Д. Это особенно важно для передач BITS на основе BranchCache и является причиной поддержки HTTP HEAD на стороне сервера. указан как требование HTTP для загрузки BITS.
При этом BITS обходит фазу запроса HTTP HEAD, сразу же отправляя запрос HTTP GET, если выполняется любое из следующих условий:
- Задание BITS настраивается с флагом BITS_JOB_PROPERTY_DYNAMIC_CONTENT.
- BranchCache отключен И задание BITS содержит один файл.
Обходной путь (1) является наиболее подходящим, так как он не влияет на другие передачи BITS в системе.
Для обходного пути (2) BranchCache можно отключить с помощью групповой политики DisableBranchCache BITS. Вам нужно будет выполнить команду "gpupdate" из командной строки с повышенными правами после внесения любых изменений в групповую политику, иначе для вступления изменений в силу потребуется ~90 минут.