ASP.NET MVC和Ajax,并发请求?

Boo*_*oob 35 ajax asp.net-mvc jquery asp.net-ajax

AJAX新手在这里!
在我的ASP.NET MVC Web应用程序中,我的AJAX请求似乎正在进行批处理或排队,我不确定.
在上一个请求完成之前,似乎没有任何请求完成.
我如何获得独立返回的请求?
我不一定希望有人给我答案,但可能有一些链接指向可能有用的好教程或资源.谢谢

Set*_*son 38

我正在扩展Lachlan Roche的答案,这是正确的.

ASP.NET框架将"单线程"处理Session范围(全局资源)的请求,以防止一个请求干扰另一个请求.在WebForms中,我认为您可以使用Page指令指定各个页面不使用Session,因此不需要像这样同步处理.

问题是在ASP.NET MVC中所有请求都使用Session,因为它用于实现TempData.您可以完全禁用会话状态,正如Lachlan Roche指出的那样,或者您可以根据具体情况处理此问题.

一个可能的解决方案可能是启动您自己的后台线程来处理任何长时间运行的代码,以便初始请求尽快"完成".


Lac*_*che 35

ASP.NET将按会话顺序处理请求,除非会话通过pages元素上的enableSessionState属性配置为禁用或仅在web.config中读取.

由于这是一个页面设置,这不会影响MVC控制器,它们仍然会受到串行请求处理.

奇怪的是,即使禁用会话或设置为只读,我们仍然可以读取和写入会话数据.它似乎只影响导致串行请求处理的会话锁定.

<system.web>
    <pages enableSessionState="ReadOnly"/>
</system.web>
Run Code Online (Sandbox Code Playgroud)

Pages也可以具有enableSessionState属性,但这与MVC视图无关.

<%@ Page EnableSessionState="True" %>
Run Code Online (Sandbox Code Playgroud)

  • 刚检查一下.在ASP.NET MVC 5中不起作用.即使Session = null,并发请求仍然是顺序的. (2认同)

And*_*ndy 30

随着ASP.MVC 3的发布,您现在可以向控制器添加一个属性,将Session标记为只读,这允许从同一客户端同时调用操作.

无会话控制器支持:

Sessionless Controller是ASP.NET MVC 3中另一个很棒的新功能.使用Sessionless Controller,您可以轻松控制控制器的会话行为.例如,您可以将HomeController的Session设置为Disabled或ReadOnly,从而允许单个用户执行并发请求.有关详细信息,请参阅ASP.NET MVC中的并发请求MVC3中的HowTo:无会话控制器 - 什么&为什么?.

- 来自这篇DZone文章.

通过添加SessionState(SessionStateBehaviour.Disabled)到控制器,运行时将允许您从同一浏览器会话同时调用多个操作.

不幸的是,我不认为有一种方法可以标记一个动作,以便只在调用该动作时禁用会话,所以如果你的控制器有一些需要会话的动作而其他动作不需要,你需要将那些没有的那些移动到一个单独的控制器中.

在ASP MVC的更高版本中,您可以使用SessionStateAttribute修饰单个控制器类

[System.Web.Mvc.SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : Controller 
{
}
Run Code Online (Sandbox Code Playgroud)