2016-11-24 37 views
1

在我的ASP.Net MVC應用程序中,我有一個後端生成報告。一旦生成報告,用戶就可以通過一個鏈接調用一個動作來下載它。但是,我覺得服務文件的動作有點慢(4到8秒),其他動作是比較即時的。服務文件作爲ASP.NET MVC操作的一部分很慢

這裏是做服務

// GET: /WS/Report/GetReport 
[HttpGet] 
public ActionResult GetReport(string fileName) 
{ 
    string path = Path.Combine(_reportGeneratedPath, fileName); 
    if (!System.IO.File.Exists(path)) 
     return XmlMessage.Error("Report does not exist"); 
    Response.ContentType = MimeMapping.GetMimeMapping(fileName); 
    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName)); 
    Response.AddHeader("Content-Length", new FileInfo(path).Length.ToString()); 

    Response.WriteFile(path); 
    Response.End(); 
    return null; 
} 

PS代碼:我不能切換到出於安全原因的直接文件訪問。

+0

這可能是有用的,http://stackoverflow.com/a/26023967/1166597 – OldTrain

回答

0

System.IO.File.Exists將是緩慢的,因爲它是一個IO操作。爲了加速你的行動,你可以使用屬於System.Runtime.Caching一部分的MemoryCache來實現緩存機制。另外,Response.WriteFile是一個同步操作,如果切換到異步的Response.TransmitFile,它可能會縮短響應時間。這種方法對於你所擁有的只是一個小的漸進式改進,你也可以使用流式處理方法,這將涉及到你所擁有的更多變化。

一旦您的報告生成完成後,您將報告完整路徑添加到緩存,然後您可以修改您的Action方法爲類似的東西(您可以隨時改進您的緩存機制,這裏是我的簡單實現,有關更多詳細信息請訪問https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx

// GET: /WS/Report/GetReport 
[HttpGet] 
public ActionResult GetReport(string fileName) 
{ 

    string path = Path.Combine(_reportGeneratedPath, fileName); 
    var reportPathCache = MemoryCache.Default; 
    if(!reportPathCache.Contains(path)) 
    { 
     return XmlMessage.Error("Report does not exist"); 
    } 
    Response.ContentType = MimeMapping.GetMimeMapping(fileName); 
    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName)); 
    Response.AddHeader("Content-Length", new FileInfo(path).Length.ToString()); 

    Response.Buffer = false; 
    Response.TransmitFile(path); 
    Response.End(); 
    return null; 
}