Как указать диапазон> 2 ГБ для HttpWebRequest в .NET 3.5 - PullRequest
3 голосов
/ 05 июля 2011

Я создаю этот класс для загрузки файлов по частям / разделам / сегментам.В .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 позволяет запрашивать байтовые диапазоны от 2 ГБ.

Поэтому возникает вопрос: Как указать диапазоны байтов 2 ГБ или выше для HttpWebRequest в .NET 3.5?

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

Это код 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) в качестве параметров.

1 голос
/ 05 июля 2011

Я полагаю, документация дает некоторое представление об этом:

Пример заголовка Range в запросе протокола HTTP, который запрашивает первые 100 байтов, будетследующее:

Range: bytes=-99\r\n\r\n

В этом примере параметр rangeSpecifier будет указан как «байты», а параметр диапазона будет -99.

Тогдаесть также это из Wikipedia :

Range
Request only part of an entity. Bytes are numbered from 0.
Range: bytes=500-999

Так что код, который вы приведете в приведенном выше примере:

HttpWebRequest.AddRange("bytes", 500, 999);
0 голосов
/ 14 февраля 2013

Поскольку .NET 4, HttpWebRequest.AddRange() поддерживает long: http://msdn.microsoft.com/en-us/library/dd992108.aspx

0 голосов
/ 05 июля 2011

Если я вас правильно понимаю, вам не хватает int и long.Но оператор перегружен только int?

Использовать заголовки.

httpWebRequest.Headers.Add("Range", "bytes=500-999");
...