۱۳۸۷/۱۲/۱۰

اضافه كردن قابليت از سرگيري مجدد (resume) به HttpWebRequest


مطابق RFC مربوطه، اگر هدر درخواست ارسالي به سرور را كمي تغيير دهيم مي‌توان بجاي شروع از اولين بايت، از بايت مورد نظر شروع به دريافت فايل نمود. (البته اين به شرطي است كه سرور آن‌را پشتيباني كند)

يعني نياز داريم كه به هدر ارسالي سطر زير را اضافه كنيم:
Range: bytes=n-
كه 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 بود، يعني اين عدد معتبر است.