• 1401/09/25

محدودیت حداکثر سرعت دانلود :

با سلام و تشکر از پشتیبانیتون.

می‌خواستم بدونم چطور می‌شه سرعت دانلود یک فایل رو به یک عدد خاص (مثل 100 kb/s) محدود کرد؟

مثلا اگر کاربر وارد شده بود بتونه فایل رو با سرعت نامحدود دانلود کنه ولی اگر نه با سرعت محدود؟

مثل uploadboy

c# - Limit download speed in ASP.NET Core 7 - Stack Overflow

این لینک سوالیه که تو Stack Overflow مطرح کردم.

ظاهرا می‌شه با تاخیر در بافرها یا یک همچنین چیزی عملیش کرد ولی درست متوجه نشدم.

  • 1401/09/26
  • ساعت 11:15

سلام دوست من وقتتون بخیر

دوست عزیزم ، لطفا این لینک رو بررسی کنید


  • 1401/09/26
  • ساعت 16:47

با سلام مجدد.

این راه حل در ASP.NET Core کار نکرد و ارور داد.

ظاهرا مال ASP قدیمی هست

راه حل دیگه‌ای نمی‌دونید؟

با تشکر از پشتیبانیتون


  • 1401/09/29
  • ساعت 09:18

دوست من لطفا اروری که بهتون نمایش داده رو به من بگید

با تشکر 


  • 1401/09/30
  • ساعت 15:57

با سلام مجدد و تشکر از پاسخگوییتون

 fail: Microsoft.AspNetCore.Server.Kestrel[13]       Connection id "0HMN38N6K75QV", Request id "0HMN38N6K75QV:00000013": An unhandled exception was thrown by the application.       System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (2369 of 35963881).

 این ارور در Console سایت موقع Runtime به من داده می‌شه. البته برای این که از این کد در Core استفاده کنم، این تغییرات رو توش دادم

public void DownloadFileWithLimitedSpeed (string fileName, string filePath, long downloadSpeed) { if (!System.IO.File.Exists (filePath)) { throw new Exception ("Err: There is no such a file to download."); } using (FileStream fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (BinaryReader br = new BinaryReader (fs)) { long fileLength = fs.Length; int pack = 1024; int sleep = (int)Math.Ceiling(1000.0 * pack / downloadSpeed); Response.Headers.Add ("Content-Length", fileLength.ToString ()); Response.ContentType = "application/octet-stream"; string utf8EncodingFileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); Response.Headers.Add ("Content-Disposition", "attachment;filename=" + utf8EncodingFileName); int maxCount = (int)Math.Ceiling(Convert.ToDouble(fileLength) / pack); for (int i = 0; i < maxCount; i++) { if (Response.HasStarted) { Response.Body.WriteAsync (br.ReadBytes (pack)); Thread.Sleep (sleep); } else { break; } } } } }

  این متدی هست که من ازش استفاده می‌کنم 

 public void OnGet () { try { DownloadFileWithLimitedSpeed ("Music.zip", "path", 100000000000); } catch { } } 

این هم OnGet باز هم ممنونم از این که به من در این مشکل کمک می‌کنید


  • 1401/10/03
  • ساعت 10:36

دوست من لطفا بازه write رو در بازه ای که اعلام کرده تنظیم کنید و ببینید مشکل رفع میشه یا نه


  • 1401/10/03
  • ساعت 17:57

با سلام مجدد و تشکر از کمکتون.

فایل با سرعت محدود دانلود می‌شه اما دو مشکل هست:

۱. سرعت دانلود در هر صورت 70 kb/s هست

۲. وقتی لینک مستقیم در IDM وارد می‌شه، دانلود هیچ اشکالی نداره، ولی اگه در مرورگر لینک رو وارد کنم، اصلا دانلود شروع نمی‌شه.

این هم کد:


	public void OnGetLimit ()
	{
		DownloadFileWithLimitedSpeed ("10mb.bin", path, 81920000000000);
		//DownloadFileWithLimitedSpeed ("10mb.bin", path, 8192);
		//No difference
	}

	public void DownloadFileWithLimitedSpeed (string fileName, string filePath, long downloadSpeed)
	{
		if (!System.IO.File.Exists (filePath))
		{
			throw new Exception ("Err: There is no such a file to download.");
		}

		using (FileStream fs = new FileStream (filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
		{
			using (BinaryReader br = new BinaryReader (fs))
			{
				//Response.Buffer = false;
				long fileLength = fs.Length;
				int pack = 1024;
				int sleep = (int)Math.Ceiling(1000.0 * pack / downloadSpeed);
				Console.WriteLine (sleep);
				Response.Headers.Add ("Content-Length", fileLength.ToString ());
				Response.ContentType = "application/octet-stream";
				string utf8EncodingFileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);
				Response.Headers.Add ("Content-Disposition", "attachment;filename=" + utf8EncodingFileName);
				int maxCount = (int)Math.Ceiling(Convert.ToDouble(fileLength) / pack);
				for (int i = 0; i < maxCount; i++)
				{
					//if (Response.HasStarted)
					{
						Response.Body.WriteAsync (br.ReadBytes (pack));
						Thread.Sleep (10);
					}
					//else
					{
						//break;
					}
				}
			}
		}
	}

بخش‌هایی که کامنت کردم وقتی باشن ارور می‌دن.

sleep هم همیشه 1 هست.

با تشکر از پشتیبانی‌تون


  • 1401/10/05
  • ساعت 21:38

با سلام مجدد و تشکر از کمکتون

Limit download speed in ASP.NET Core (github.com)

این لینک نسخه اصلاح شده‌ی کد هست

این متد تست شده تقریبا کار می‌کنه.

برای دوستانی که همین مشکل من رو داشتن.


  • 1401/10/06
  • ساعت 11:08

با تشکر از شما دوست عزیز بابت به اشتراک گذاری لینک