سلام خسته نباشید
این اکشن چرا خروجی ندارد؟
چه درست باشد چه نادرست null برمیگرداند
میشه توضیح بدید کلا این تابع چه امنیتی را فراهم میکند؟
ممنون
  public FilePathResult DownloadLink(int ID, string Uniqid, int IDBill)        {
var qbill = db.Tbl_Bill.Where(a => a.Bill_Id == IDBill).FirstOrDefault().Bill_Productid;


var qdown = db.Tbl_Download.Where(a => a.Download_Productid == qbill && a.Download_Allow == true).FirstOrDefault();


var qtemp = db.Tbl_TempDL.Where(a => a.TepmDl_ID == ID && a.TepmDl_UniqNo == Uniqid && a.TepmDl_Exp > DateTime.Now).SingleOrDefault();


if (qtemp == null)
return null;


if (qdown == null)
return null;


string strPathName = Server.MapPath("~/Content/Uploder/" + qdown.Download_Url);




if (System.IO.File.Exists(strPathName) == false)
{
return null;
}
// **************************************************


System.IO.Stream oStream = null;


try
{
// بازکردن فایل
oStream =
new System.IO.FileStream
(path: strPathName,
mode: System.IO.FileMode.Open,
share: System.IO.FileShare.Read,
access: System.IO.FileAccess.Read);


// **************************************************
Response.Buffer = false;


// تنظیم نوع محتوا که ناشناخته است
Response.ContentType = "application/octet-stream";


// تنظیم نام فایل روی دیالوگ دانلود یا دانلود منیجر برای نمایش به کاربر
Response.AddHeader("Content-Disposition", "attachment; filename=" + strPathName);


long lngFileLength = oStream.Length;


// ارسال حجم فایل دانلودی به مرورگر کاربر
Response.AddHeader("Content-Length", lngFileLength.ToString());
// **************************************************


// پر کردن متغییر از حجم فایل برای خواندن بایت های فایل
long lngDataToRead = lngFileLength;


// برسی اینکه خواندن فایل هنوز به پایان نرسیده
while (lngDataToRead > 0)
{
// کد زیر را فقط برای تست گذاشتیم که یک وقفه ی 2 میلی ثانیه ای ایجاد میکنه
//System.Threading.Thread.Sleep(200);


// برسی اینکه آیا کاربر هنوز متصل هست و می خواد دانلود ادامه داشته باشه
if (Response.IsClientConnected)
{
// هربار چه مقدار از بایت ها خونده بشه
int intBufferSize = 1024 * 1024;


// ایجاد بافر برای خواندن فایل مقداری از فایل که در متغییر بالا تعیین شده
byte[] bytBuffers =
new System.Byte[intBufferSize];


// خواندن داده ها و گذاشتن در بافر ایجاد شده در مرحله ی قبل
int intTheBytesThatReallyHasBeenReadFromTheStream =
oStream.Read(buffer: bytBuffers, offset: 0, count: intBufferSize);


// خواندن داده ها از بافر و نوشتن داده ها روی مخزن جاری برای ارسال به کاربر
Response.OutputStream.Write
(buffer: bytBuffers, offset: 0,
count: intTheBytesThatReallyHasBeenReadFromTheStream);


// ارسال داده های که در مرحله ی قبل در مخزن گذاشته شدند برای مرور گر کاربر
// خیلی کم از حافظه ی رم استفاده می کند
Response.Flush();


// کم کردن داده های ارسال شده از داده های اصلی
lngDataToRead =
lngDataToRead - intTheBytesThatReallyHasBeenReadFromTheStream;
}
else
{
// در صورتی که کاربر قطع اتصال کرده باشد توسط دستور زیر از حلقه جلوگیری میی کند
lngDataToRead = -1;
}
}


return null;


}
catch
{
return null;
}
finally
{
if (oStream != null)
{
// بستن فایل
oStream.Close();
oStream.Dispose();
oStream = null;
}
Response.Close();
}


}