Как указать диапазон>2 ГБ для HttpWebRequest в.NET 3.5
Я строю этот класс для загрузки файлов по частям / разделам / сегментам. В.NET 4.0 я могу использовать этот код, чтобы указать диапазон для загрузки с
long startPos = int.MaxValue+1;
HttpWebRequest.AddRange(startPos);
и это работает, потому что существует длинная перегрузка для метода AddRange.
Когда я посмотрел версию.NET 3.5, я понял, AddRange()
метод позволяет использовать int
только.
Возможный обходной путь будет использовать AddRange(string, int)
или же AddRange(string, int, int)
методы. Поскольку класс должен работать в.NET 3.5, мне придется перейти к спецификации строк, но, к сожалению, я не могу найти пример кода, который показывает, как задать диапазоны с помощью этой процедуры в.NET 3.5. Кто-нибудь может показать, как это сделать?
Благодарю.
Обновить
Как показывает первый пример кода, который я написал, я хотел бы указать диапазон типов long
вместо int
, Используя тип int
позволяет запрашивать байтовые диапазоны только до 2 ГБ, но long
позволяет запрашивать байтовые диапазоны до 2GB.
Поэтому возникает вопрос: как мне указать байтовые диапазоны 2 ГБ или выше на HttpWebRequest
в.NET 3.5?
4 ответа
Это код Mutant_Fruit, скопированный из WebRequest.AddRange - как насчет файлов> 2 ГБ? показывая, как добавить спецификатор диапазона длиннее 2 ГБ в запрос HttpWebRequest.
MethodInfo method = typeof(WebHeaderCollection).GetMethod
("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http://www.example.com/file.exe");
long start = int32.MaxValue;
long end = int32.MaxValue + 100000;
string key = "Range";
string val = string.Format ("bytes={0}-{1}", start, end);
method.Invoke (request.Headers, new object[] { key, val });
Я написал этот метод расширения для него.
#region HttpWebRequest.AddRange(long)
static MethodInfo httpWebRequestAddRangeHelper = typeof(WebHeaderCollection).GetMethod
("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
/// <summary>
/// Adds a byte range header to a request for a specific range from the beginning or end of the requested data.
/// </summary>
/// <param name="request">The <see cref="System.Web.HttpWebRequest"/> to add the range specifier to.</param>
/// <param name="start">The starting or ending point of the range.</param>
public static void AddRange(this HttpWebRequest request, long start) { request.AddRange(start, -1L); }
/// <summary>Adds a byte range header to the request for a specified range.</summary>
/// <param name="request">The <see cref="System.Web.HttpWebRequest"/> to add the range specifier to.</param>
/// <param name="start">The position at which to start sending data.</param>
/// <param name="end">The position at which to stop sending data.</param>
public static void AddRange(this HttpWebRequest request, long start, long end)
{
if (request == null) throw new ArgumentNullException("request");
if (start < 0) throw new ArgumentOutOfRangeException("start", "Starting byte cannot be less than 0.");
if (end < start) end = -1;
string key = "Range";
string val = string.Format("bytes={0}-{1}", start, end == -1 ? "" : end.ToString());
httpWebRequestAddRangeHelper.Invoke(request.Headers, new object[] { key, val });
}
#endregion
Методы расширения, описанные выше, требуют следующего using
директивы
using System.Reflection;
using System.Net;
И нет необходимости использовать этот метод расширения в.NET 4, потому что есть две перегрузки AddRange
метод, который принимает int64
(long
) в качестве параметров.
Начиная с.NET 4, HttpWebRequest.AddRange()
поддерживает долго: http://msdn.microsoft.com/en-us/library/dd992108.aspx
Я считаю, что документация дает некоторое представление об этом:
Пример заголовка Range в запросе протокола HTTP, который запрашивает первые 100 байтов, будет следующим:
Range: bytes=-99\r\n\r\n
В этом примере параметр rangeSpecifier будет указан как "байты", а параметр диапазона будет равен -99.
Тогда есть также это из Википедии:
Range
Request only part of an entity. Bytes are numbered from 0.
Range: bytes=500-999
Таким образом, код, который вы приведете в приведенном выше примере:
HttpWebRequest.AddRange("bytes", 500, 999);
Если я вас правильно понимаю, вам не хватает int и long. Но перегрузка оператора только int?
Используйте заголовки.
httpWebRequest.Headers.Add("Range", "bytes=500-999");