3

我正在构建这个类来下载部分/部分/段中的文件。在 .NET 4.0 中,我可以使用此代码指定下载范围

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

它之所以有效,是因为 AddRange 方法有很长的重载。

当我查看 .NET 3.5 版本时,我意识到该AddRange()方法int只允许使用。

可能的解决方法是使用AddRange(string, int)orAddRange(string, int, int)方法。由于该类必须在 .NET 3.5 中工作,因此我必须使用字符串规范,但不幸的是,我似乎找不到任何示例代码来说明如何在 .NET 3.5 中使用此过程指定范围。任何人都可以展示如何做到这一点?

谢谢。

更新

正如我编写的第一个代码示例所示,我想指定一个类型范围long而不是int. 使用 typeint只允许请求最多 2GB 的字节范围,但long允许请求超过 2GB 的字节范围。

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

4

4 回答 4

5

这是Mutant_FruitWebRequest.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;

并且没有必要在 .NET 4 中使用这个扩展方法,因为AddRange接受int64( long) 作为参数的方法有两个重载。

于 2011-07-05T08:47:20.983 回答
2

从 .NET 4 开始,HttpWebRequest.AddRange()支持 long:http: //msdn.microsoft.com/en-us/library/dd992108.aspx

于 2013-02-14T17:57:25.787 回答
1

我相信文档可以对此有所了解:

请求前 100 个字节的 HTTP 协议请求中的 Range 标头示例如下:

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

对于此示例,rangeSpecifier 参数将被指定为“字节”,而 range 参数将是 -99。

然后还有来自维基百科的这个:

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

所以你会在上面的例子中得到的代码是

HttpWebRequest.AddRange("bytes", 500, 999);
于 2011-07-04T22:07:45.290 回答
0

如果我理解正确,你没有足够的 int 和 long。但是运算符重载只是int?

使用标题。

httpWebRequest.Headers.Add("Range", "bytes=500-999");
于 2011-07-04T22:54:16.713 回答