2016-12-05 42 views
6

在試圖加快我們的MVC的一個網頁一些Ajax調用,我遇到了一些奇怪的行爲,我真的不能解釋。我每N秒都會進行一次ajax調用來查詢一些統計數據。Ajax調用速度較慢到控制器在物理上不同的文件

好像Ajax調用被給控制器製成在物理上不同的文件比類似的呼叫被以相同的物理文件爲其中視圖從始發控制器做出慢得多。

見我的簡化的例子:

情況1:只有1個文件

FooController.cs

namespace FooBar.Areas.FooArea.Controllers 
{ 
    [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
    public class FooTestController: _BaseController 
    { 
     public JsonResult GetStats() 
     { 
      try 
      { 
       var req = new RestRequest() { Method = Method.GET }; 
       req.AddHeader("Content-Type", "application/json"); 
       req.AddHeader("Accept", "application/json"); 
       req.AddParameter("apikey", /*APIKEY*/); 

       var client = new RestClient(/*STATSURL*/); 
       var response = client.Execute(req); 

       if (response.StatusCode == HttpStatusCode.OK) 
        return Json(new { success = true, content = response.Content }); 
       else 
        return Json(new { success = false }); 
      } 
      catch 
      { 
       return Json(new { success = false }); 
      } 
     } 

     public JsonResult GetAgents() 
     { 
      var req = new RestRequest() { Method = Method.GET }; 
      req.AddHeader("Content-Type", "application/json"); 
      req.AddHeader("Accept", "application/json"); 
      req.AddParameter("apikey", /*APIKEY*/); 

      try 
      { 
       var client = new RestClient(/*AGENTSURL*/); 
       var response = client.Execute(req); 

       if (response.StatusCode == HttpStatusCode.OK) 
        return Json(new { success = true, content = response.Content }); 
       else 
        return Json(new { success = false }); 
      } 
      catch 
      { 
       return Json(new { success = false }); 
      } 
     } 
    } 

    public class FooController : _BaseController 
    { 
     // VIEW OF THE PAGE MAKING THE AJAX REQUESTS 
     public ActionResult Index() 
     { 
      Title = "Home"; 
      return View(); 
     } 
    } 
} 

情況2:2個在同一個文件夾

單獨的文件

jQuery的

$.ajax({ 
    url: // URL TO ACTION DEPENDING ON SITUATION, 
    type: "POST", 
    dataType: "json", 
    cache: false, 
    success: function (result) 
    { 
     if (result.success) 
     { 
      var content = JSON.parse(result.content); 
      console.log(content); 
     } 
    } 
}); 
FooController.cs

namespace FooBar.Areas.FooArea.Controllers 
{ 
    public class FooController: _BaseController 
    { 
     // VIEW OF THE PAGE MAKING THE AJAX REQUESTS 
     public ActionResult Index() 
     { 
      Title = "Home"; 
      return View(); 
     } 
    } 
} 

FooAjaxController.cs

namespace FooBar.Areas.FooArea.Controllers 
{ 
    [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 
    public class FooAjaxController: _BaseController 
    { 
     public JsonResult GetStats() 
     { 
      try 
      { 
       var req = new RestRequest() { Method = Method.GET }; 
       req.AddHeader("Content-Type", "application/json"); 
       req.AddHeader("Accept", "application/json"); 
       req.AddParameter("apikey", /*APIKEY*/); 

       var client = new RestClient(/*STATSURL*/); 
       var response = client.Execute(req); 

       if (response.StatusCode == HttpStatusCode.OK) 
        return Json(new { success = true, content = response.Content }); 
       else 
        return Json(new { success = false }); 
      } 
      catch 
      { 
       return Json(new { success = false }); 
      } 
     } 

     public JsonResult GetAgents() 
     { 
      var req = new RestRequest() { Method = Method.GET }; 
      req.AddHeader("Content-Type", "application/json"); 
      req.AddHeader("Accept", "application/json"); 
      req.AddParameter("apikey", /*APIKEY*/); 

      try 
      { 
       var client = new RestClient(/*AGENTSURL*/); 
       var response = client.Execute(req); 

       if (response.StatusCode == HttpStatusCode.OK) 
        return Json(new { success = true, content = response.Content }); 
       else 
        return Json(new { success = false }); 
      } 
      catch 
      { 
       return Json(new { success = false }); 
      } 
     } 
    } 
} 

在這兩種情況下,Ajax調用jQuery的從如下製成10

現在,是從兩種情況的Ajax請求的響應時間如下,情況1被顯示在左側和情況2右側:

enter image description here enter image description here

所以,你可以在情況1下看到撥打GetStats()GetAgents()的呼叫的平均時間分別是52.8毫秒53.8毫秒

然而,在情況2,呼叫的平均時間爲486.8毫秒529.9毫秒

我現在的問題是:當這些動作駐留在一個物理上不同的文件中的控制器中時,平均差不多慢10倍,而這些動作駐留在一個共享與首先渲染視圖的文件相同的物理文件?

是因爲含有渲染視圖的操作的文件已加載和保存在內存中,而單獨的文件,如在情況2,打開和關閉每一個動作被調用時?還是更險惡的事情呢?

+2

爲了完全回答這個問題,我懷疑可能需要'OTHER STUFF' - 要麼進一步縮小,要麼進一步縮小,直到您可以發佈顯示此行爲的完整示例。 –

+0

@AntP不夠公平。我添加了'OTHER STUFF',但我認爲這不會有什麼不同,因爲這兩種情況下的操作完全相同(調用第三方URL來獲取某些統計信息/代理)。 – ZiNNED

+1

在不同文件中有相關類的控制器會被編譯成一個DLL,所以這個過程並不真的知道兩者之間的區別......聽起來像其他事情正在發生? –

回答

0

您共享大部分代碼,但不_BaseController.cs

  1. 對每個請求,MVC使用依賴注入得到控制。
    [推測] MVC可能會存儲最近使用過的控制器,多次返回同一個控制器。但是,如果您正在切換控制器,可能每次都會創建一個新控制器。

  2. 也許在_BaseController缺省構造函數中有一些非常慢的代碼 - 可能是數據庫查詢。這聽起來不太可能,但發生在我的經歷。

總之,這些事情會導致你描述的放緩。

+0

感謝您的回覆。到目前爲止,我還沒有時間進一步真正調查這個問題,但我仍然打算這麼做。你做的第一點可能有意義,但很難證明。第2點並不是我想的問題,因爲兩種情況都使用相同的_BaseController。但是,我可以嘗試進行不依賴於任何_BaseController的設置。 – ZiNNED

相關問題