مطابق
RFC مربوطه، اگر هدر درخواست ارسالی به سرور را کمی تغییر دهیم میتوان بجای شروع از اولین بایت، از بایت مورد نظر شروع به دریافت فایل نمود. (البته این به شرطی است که سرور آنرا پشتیبانی کند)
یعنی نیاز داریم که به هدر ارسالی سطر زیر را اضافه کنیم:
که n در اینجا حجم فایل ناقص دریافتی موجود بر حسب بایت است.
برای بدست آوردن اندازهی فایل ناقص موجود میتوان از دستور زیر استفاده کرد:
using System.IO;
long brokenLen = new FileInfo(fileNamePath).Length;
سپس اگر شیء webRequest ما به صورت زیر تعریف شده باشد:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
فقط کافی است سطر زیر را جهت افزودن قابلیت از سرگیری مجدد دریافت فایل به این شیء افزود:
//دانلود از ادامه
webRequest.AddRange((int)brokenLen); //resume
نکته:
اگر علاقمند باشید که ریز فعالیتهای انجام شده توسط فضای نام System.Net را ملاحظه کنید، به فایل config خود (مثلا فایل app.config برنامه)، چند سطر زیر را اضافه کنید:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net">
<listeners>
<add name="MyTraceFile"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add
name="MyTraceFile"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="System.Net.trace.log"
/>
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
</switches>
</system.diagnostics>
</configuration>
به این صورت کلیه هدرهای ارسالی به سرور و ریز فعالیتهای انجام شده در پشت صحنهی کلاسهای موجود در فایلی به نام System.Net.trace.log برای شما ثبت خواهد شد.
ملاحظات:
بدیهی است پیاده سازی قابلیت resume نیاز به موارد زیر خواهد داشت:
الف) در نظر گرفتن مسیری پیش فرض برای ذخیره سازی فایلها
ب) پیدا کردن اندازهی فایل موجود بر روی یک سرور و مقایسهی آن با حجم فایل موجود بر روی هارد
امکان پیدا کردن اندازهی یک فایل هم بدون دریافت کامل آن میسر است. خاصیت ContentLength مربوط به شیء HttpWebResponse بیانگر اندازهی یک فایل بر روی سرور است و صد البته پیش از استفاده از این عدد، مقدار StatusCode شیء نامبرده را بررسی کنید. اگر مساوی OK بود، یعنی این عدد معتبر است.