如何在 .NET 3.5 中为 HttpWebRequest 指定范围 >2GB



我构建这个类是为了下载部分/节/段中的文件。在.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只允许请求高达2GB的字节范围,但long允许请求2GB以上的字节范围。

因此,问题是:如何在.NET 3.5中的HttpWebRequest上指定2GB或更高的字节范围

这是Mutant_Fruit从WebRequest.AddRange复制的代码-文件>2gb怎么样?展示了如何将超过2GB的范围说明符添加到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;

并且在.NET4中不需要使用这个this扩展方法,因为AddRange方法有两个重载接受int64(long(作为参数。

由于.NET 4,HttpWebRequest.AddRange()支持长:http://msdn.microsoft.com/en-us/library/dd992108.aspx

我相信文档提供了一些见解:

中Range标头的示例请求的HTTP协议请求前100个字节将是以下内容:

Range: bytes=-99rnrn

对于本例,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");

相关内容

  • 没有找到相关文章

最新更新