【发布时间】:2017-04-19 23:27:26
【问题描述】:
在尝试加速我们的一个 MVC 页面中的一些 ajax 调用时,我遇到了一些我无法真正解释的奇怪行为。我每隔 N 秒就会进行一些 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 个单独的文件
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 进行的,如下所示:
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);
}
}
});
现在,两种情况下 ajax 请求的响应时间如下,左侧显示情况 1,右侧显示情况 2:
因此,您可以看到在情况 1 中调用 GetStats() 和 GetAgents() 的平均时间分别为 52.8 ms 和 53.8 ms。
但是,在情况 2 中,调用的平均时间为 486.8 ms 和 529.9 ms。
我现在的问题是:当这些操作驻留在物理上不同的文件中的控制器中时,对动作进行的 ajax 调用平均比当这些动作驻留在共享相同文件的控制器中时平均慢 10 倍。物理文件作为首先渲染视图的文件?
是不是因为包含渲染视图的动作的文件已经加载并保存在内存中,而单独的文件,如情况 2,每次调用动作时都会打开和关闭?还是发生了更险恶的事情?
【问题讨论】:
-
我怀疑可能需要
OTHER STUFF才能完全回答这个问题 - 或者进一步缩小范围,直到您可以发布一个显示此行为的完整示例。 -
@AntP 够公平的。我添加了
OTHER STUFF,虽然我认为这不会产生影响,因为两种情况下的操作完全相同(调用第三方 URL 以获取一些统计信息/代理)。 -
在不同文件中具有相关类的控制器被编译到一个 DLL 中,所以进程并不真正知道这两种方式的区别......听起来像是在发生其他事情?
-
@BrianMains 这是有道理的。我将不得不进一步研究发生了什么。当我知道更多时,我会回来报告!
标签: c# ajax asp.net-mvc