Cómo especificar el rango> 2 GB para HttpWebRequest en .NET 3.5

Estoy construyendo esta clase para descargar archivos en partes / secciones / segmentos. En .NET 4.0, puedo usar este código para especificar el rango para descargar desde

long startPos = int.MaxValue+1; HttpWebRequest.AddRange(startPos); 

y funciona porque hay una sobrecarga larga para el método AddRange.

Cuando busqué la versión .NET 3.5, me di cuenta de que el método AddRange() solo permite el uso de int .

La posible solución sería utilizar los AddRange(string, int) o AddRange(string, int, int) . Dado que la clase tendrá que trabajar en .NET 3.5, tendré que ir con la especificación de cadena, pero desafortunadamente no puedo encontrar ningún código de muestra que muestre cómo especificar rangos usando este procedimiento en .NET 3.5. ¿Puede alguien mostrar cómo hacer esto?

Gracias.

Actualizar

Como muestra el primer ejemplo de código que escribí, me gustaría especificar un rango de tipo long lugar de int . El uso de tipo int permite solicitar rangos de bytes solo hasta 2 GB, pero long permite solicitar rangos de bytes más allá de 2 GB.

Por lo tanto, la pregunta es: ¿Cómo puedo especificar rangos de bytes de 2 GB o más en HttpWebRequest en .NET 3.5?

Este es el código de Mutant_Fruit copiado de WebRequest.AddRange. ¿Qué pasa con los archivos> 2 gb? muestra cómo agregar un especificador de rango de más de 2 GB a un 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 }); 

Escribí este método de extensión para ello.

 #region HttpWebRequest.AddRange(long) static MethodInfo httpWebRequestAddRangeHelper = typeof(WebHeaderCollection).GetMethod ("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic); ///  /// Adds a byte range header to a request for a specific range from the beginning or end of the requested data. ///  /// The  to add the range specifier to. /// The starting or ending point of the range. public static void AddRange(this HttpWebRequest request, long start) { request.AddRange(start, -1L); } /// Adds a byte range header to the request for a specified range. /// The  to add the range specifier to. /// The position at which to start sending data. /// The position at which to stop sending data. 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 

Los métodos de extensión anteriores necesitan lo siguiente using directivas

 using System.Reflection; using System.Net; 

Y no hay necesidad de usar este método de esta extensión en .NET 4 porque hay dos sobrecargas del método AddRange que aceptan int64 ( long ) como parámetros.

Creo que la documentación da una idea de eso:

Un ejemplo de un encabezado de rango en una solicitud de protocolo HTTP que solicita los primeros 100 bytes sería el siguiente:

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

Para este ejemplo, el parámetro rangeSpecifier se especificaría como “bytes” y el parámetro range sería -99.

Luego también está esto de Wikipedia :

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

Así que el código que darías en el ejemplo anterior es

 HttpWebRequest.AddRange("bytes", 500, 999); 

Si te entiendo correctamente, no tienes suficiente int y largo. Pero la sobrecarga del operador sólo int?

Utilice encabezados.

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

Desde .NET 4, HttpWebRequest.AddRange() admite durante mucho tiempo: http://msdn.microsoft.com/en-us/library/dd992108.aspx