gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:39:20 24 4
gpt4 key购买 nike

我正在构建这个类来下载部分/节/段中的文件。在 .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_FruitWebRequest.AddRange - what about files > 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) 作为参数的方法。

关于c# - 如何在 .NET 3.5 中为 HttpWebRequest 指定 >2GB 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com