gpt4 book ai didi

c# - Ajax 调用在物理上不同的文件中对 Controller 较慢

转载 作者:太空狗 更新时间:2023-10-29 22:00:08 26 4
gpt4 key购买 nike

在我们的一个 MVC 页面中尝试加速某些 ajax 调用时,我遇到了一些我无法真正解释的奇怪行为。我每隔 N 秒就会进行一些 ajax 调用,以轮询一些统计数据。

似乎在物理上不同的文件中对 Controller 进行 ajax 调用比在与 View 来源相同的物理文件中对 Controller 进行类似调用要慢得多。

查看我的简化示例:

情况一:只有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:

enter image description here enter image description here

因此,如您所见,在情况 1 中调用 GetStats()GetAgents() 的平均时间为 52.8 毫秒53.8 毫秒

然而,在情况 2 中,调用的平均时间为 486.8 毫秒529.9 毫秒

我现在的问题是:当这些 Action 驻留在物理上不同文件的 Controller 中时,对 Action 进行的 ajax 调用为什么比驻留在共享相同文件的 Controller 中平均慢近 10 倍物理文件作为首先呈现 View 的文件?

是否因为包含渲染 View 的 Action 的文件已经加载并保存在内存中,而单独的文件,如情况 2,在每次调用 Action 时打开和关闭?还是正在发生更险恶的事情?

最佳答案

您共享了大部分代码,但没有共享 _BaseController.cs

  1. 对于每个请求,MVC 使用依赖注入(inject)获取 Controller 。
    [推测] MVC 可能会存储最近使用的 Controller ,多次返回相同的 Controller 。但是,如果您要切换 Controller ,它可能每次都会创建一个新 Controller 。

  2. 也许 _BaseController 默认构造函数中有一些非常慢的代码 - 可能是数据库查询。这听起来不太可能,但在我的经验中确实发生过。

综合起来,这些因素会导致您描述的减速。

关于c# - Ajax 调用在物理上不同的文件中对 Controller 较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com