在試圖加快我們的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右側:
所以,你可以在情況1下看到撥打GetStats()
和GetAgents()
的呼叫的平均時間分別是52.8毫秒和53.8毫秒。
然而,在情況2,呼叫的平均時間爲486.8毫秒和529.9毫秒。
我現在的問題是:當這些動作駐留在一個物理上不同的文件中的控制器中時,平均差不多慢10倍,而這些動作駐留在一個共享與首先渲染視圖的文件相同的物理文件?
是因爲含有渲染視圖的操作的文件已加載和保存在內存中,而單獨的文件,如在情況2,打開和關閉每一個動作被調用時?還是更險惡的事情呢?
爲了完全回答這個問題,我懷疑可能需要'OTHER STUFF' - 要麼進一步縮小,要麼進一步縮小,直到您可以發佈顯示此行爲的完整示例。 –
@AntP不夠公平。我添加了'OTHER STUFF',但我認爲這不會有什麼不同,因爲這兩種情況下的操作完全相同(調用第三方URL來獲取某些統計信息/代理)。 – ZiNNED
在不同文件中有相關類的控制器會被編譯成一個DLL,所以這個過程並不真的知道兩者之間的區別......聽起來像其他事情正在發生? –