AJAX新手在这里!
目前在我的ASP.NET MVC Web应用程序中,我的AJAX请求似乎正在进行批处理或排队,我不确定
在上一个请求完成之前,似乎没有任何请求完成
如何获得独立返回的请求?
我不一定希望有人给我答案,但可能有一些链接指向可能有用的好教程或资源。感谢
答案 0 :(得分:37)
我正在扩大Lachlan Roche的答案,这是正确的。
ASP.NET框架将“单线程”请求处理会话范围(全局资源),以防止一个请求干扰另一个请求。在WebForms中,我认为您可以使用Page指令指定各个页面不使用Session,因此不需要像这样同步处理。
问题是在 ASP.NET MVC中所有请求都使用Session ,因为它用于实现TempData。您可以完全禁用会话状态,正如Lachlan Roche指出的那样,或者您可以根据具体情况处理此问题。
一种可能的解决方案可能是启动您自己的后台线程来处理任何长时间运行的代码,以便初始请求尽快“完成”。
答案 1 :(得分:35)
ASP.NET将按会话顺序处理请求,除非会话通过pages元素的enableSessionState属性配置为禁用或仅在web.config中读取。
由于这是一个页面设置,这不会影响MVC控制器,它们仍然会受到串行请求处理。
奇怪的是,即使禁用会话或设置为只读,我们仍然可以读取和写入会话数据。它似乎只影响导致串行请求处理的会话锁定。
<system.web>
<pages enableSessionState="ReadOnly"/>
</system.web>
Pages也可以有一个enableSessionState属性,但这与MVC视图无关。
<%@ Page EnableSessionState="True" %>
答案 2 :(得分:30)
随着ASP.MVC 3的发布,您现在可以向控制器添加一个属性,将Session标记为只读,这样就可以从同一个客户端同时调用操作。
无会话控制器支持:
Sessionless Controller是ASP.NET MVC 3中另一个很棒的新功能。使用Sessionless Controller,您可以轻松控制控制器的会话行为。例如,您可以将HomeController的Session设置为Disabled或ReadOnly,从而允许单个用户执行并发请求。有关详细信息,请参阅Concurrent Requests In ASP.NET MVC和HowTo: Sessionless Controller in MVC3 – what & and why?。
- 来自this DZone article。
通过向控制器添加SessionState(SessionStateBehaviour.Disabled)
,运行时将允许您从同一浏览器会话同时调用多个操作。
不幸的是,我认为没有办法标记某个操作,只能在调用该操作时禁用该会话,因此如果您的控制器有一些需要会话的操作而其他操作不需要,你需要将那些没有的那些移动到一个单独的控制器中。
在ASP MVC的更高版本中,您可以使用SessionStateAttribute
装饰各个控制器类[System.Web.Mvc.SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : Controller
{
}
答案 3 :(得分:2)
自.NET Framework v3.0发布以来,您可以在SessionStateAttribute中使用“SessionStateBehavior”枚举:
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class MyController : BaseController { }
答案 4 :(得分:-2)
好的并发请求更多依赖于浏览器以及如果你开始假设10个并发请求到一个动作在Mozilla中使用AJax并且使用IE 8同样你会发现Mozilla有样式来触发一个请求等待它的响应然后触发第二个等等......对于这个是一个接一个的基础,而在IE *中,每次向服务器发出约6个并发请求。
因此并发请求也取决于浏览器类型。
答案 5 :(得分:-5)
我建议使用jQuery来满足您对asp.net mvc的ajax需求,我已经专门使用它并且它非常容易。
至于教程,我会看一下:http://docs.jquery.com/Ajax
有很多选项可以使用,我还建议下载firebug,这样你就可以异步地观察从你的页面启动的请求,看看它们是否会触发以及它们返回的内容等。
与其他人一样,AJAX请求是异步的,不会排队,并且它们都会在完成时独立返回,所以如果你在firebug中观看,很容易看到幕后发生的事情以及之前的情况调试器被点击