3

パーツ/セクション/セグメントでファイルをダウンロードするために、このクラスを構築しています。.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。type を使用intすると、最大 2GB までのバイト範囲のみを要求longできますが、2GB を超えるバイト範囲を要求できます。

したがって、問題は次のとおりです。.NET 3.5で 2GB 以上のバイト範囲を指定するにはどうすればよいですか?HttpWebRequest

4

4 に答える 4

5

これは WebRequest.AddRange からコピーされた Mutant_Fruit によるコードです-ファイル > 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;

また、 ( ) をパラメーターとしてAddRange受け入れるメソッドのオーバーロードが 2 つあるため、.NET 4 でこの拡張メソッドを使用する必要はありません。int64long

于 2011-07-05T08:47:20.983 に答える
2

.NET 4 以降、HttpWebRequest.AddRange()ロングをサポート: 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 パラメーターは「bytes」として指定され、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 に答える