asp.net mvc 4控制器并行执行多个ajax调用

Posted

技术标签:

【中文标题】asp.net mvc 4控制器并行执行多个ajax调用【英文标题】:asp.net mvc 4 controller execute multiple ajax calls in parallel 【发布时间】:2013-03-21 13:55:01 【问题描述】:

我有一个 asp.net MVC 4 控制器,它的方法是通过 ajax 调用的。

问题在于 ajax 请求是由控制器按顺序处理的。 这会导致性能问题,因为加载页面的时间是所有 ajax 请求的总和,而不是最长的 ajax 请求。

为了证明这一点,我在第一个(“ReadOverview8Week”)方法中设置了一个断点。 这些方法中的每一个都需要大约 600 毫秒来执行个性化。

如何让控制器同时响应所有三个请求? 我使用的是 iis 8。

这是 ajax 请求(来自 kendo ui 数据源)

.DataSource(dataSource => dataSource.Ajax()
   .Read(read => read.Action("ReadAllSitesOverview", "AbuseCase").Type(HttpVerbs.Get))

谢谢。

【问题讨论】:

包含您的 ajax 请求的代码。 本例中的 ajax 请求来自剑道数据源。 【参考方案1】:

您面临的问题是由 ASP.NET 管理会话的方式引起的。这是ASP.NET Session State Overview 中最重要的部分(并发请求和会话状态部分):

每个会话对 ASP.NET 会话状态的访问是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求只有在第一个请求完成后才会执行。

如果您的操作不需要访问会话,则可以解决您的问题。如果是这样的话,你可以用SessionStateAttribute属性来装饰控制器:

[SessionState(SessionStateBehavior.Disabled)]

这样控制器就不必等待会话了。

如果您的操作只需要对会话的读取权限,您可以尝试使用 SessionStateBehavior.ReadOnly 值。这不会导致独占锁,但请求仍需等待读写请求设置的锁。

【讨论】:

把它放在控制器上解决了我的问题!谢谢。 如何在 web api 中执行此操作。我注意到我在短时间内多次点击 api,它们的执行速度要慢得多。 @vlado 如果您使用的是 ASP.NET Web API,问题是一样的(它不影响自托管)。更改它的唯一方法是通过 web.config。确保你的方法是异步的也会有所帮助。 虽然数据访问是同步的,但这有点帮助?我认为ajax请求是完全独立的。我仍然没有找到简单的解释为什么异步请求不是完全“异步”以及如果请求已经是异步的(彼此独立),为什么异步 Web api 方法会有所帮助。 @Vlado AJAX 请求从浏览器的角度来看是“异步的”,而不是服务器。在服务器上,所有请求都是相同的,并且在 ASP.NET Web 应用程序的上下文中,会话是同步根,除非您禁用它。使 ApiController 方法异步(我的意思不仅仅是将 async 关键字放在它前面,而且还使用异步方法来访问数据库等)导致该方法在等待外部资源时不会阻塞线程 - 它有点帮助;) .如果您愿意,我建议我们通过电子邮件继续讨论,以免向 cmets 发送垃圾邮件。

以上是关于asp.net mvc 4控制器并行执行多个ajax调用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC Core/6:多个提交按钮

ASP.NET MVC Core/6:多个提交按钮

ASP.Net MVC 6 线程优化[关闭]

ASP.NET Web API 从 MVC 4 控制器失败

ASP.NET MVC 3以一种形式提交多个输入

如何将项目列表从视图传递到控制器(ASP.NET MVC 4)