【问题标题】:ASP.NET MVC and Ajax, concurrent requests?ASP.NET MVC 和 Ajax,并发请求?
【发布时间】:2011-01-20 13:46:15
【问题描述】:

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

【问题讨论】:

  • 请发布 AJAX 请求的代码和处理它的控制器操作。

标签: asp.net-mvc ajax asp.net-ajax jquery


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    <system.web>
        <pages enableSessionState="ReadOnly"/>
    </system.web>
    

    页面也可以有一个 enableSessionState 属性,尽管这与 MVC 视图无关。

    <%@ Page EnableSessionState="True" %>
    

    【讨论】:

    • 刚刚检查过了。在 ASP.NET MVC 5 中不起作用。即使 Session = null,并发请求仍然是顺序的。
    • 和拉克兰罗氏有同样的问题
    • 见安迪的回答。这个控制器属性对我有用:[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    【解决方案3】:

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

    无会话控制器支持:

    无会话控制器是 ASP.NET MVC 3 中另一个很棒的新功能。使用无会话控制器,您可以轻松控制控制器的会话行为。例如,您可以将 HomeController 的 Session 设置为 Disabled 或 ReadOnly,从而允许单个用户的并发请求执行。详情见Concurrent Requests In ASP.NET MVCHowTo: 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 
    {
    }
    

    【讨论】:

    • 可以参考下面的文章sapoval.org/per-action-custom-sessionstateattribute实现自己的Action Based Session Management
    • 刚刚检查过了。在 ASP.NET MVC 5 中不起作用。即使 Session = null,并发请求仍然是顺序的。
    • 请同时提及[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    • @PhilippMunin,刚刚检查过,该属性在 asp.net mvc 4 中对我有用。应该也适用于 5。该属性已添加回版本 3。
    【解决方案4】:

    自 .NET Framework v3.0 发布以来,您可以将“SessionStateBehavior”枚举与 SessionStateAttribute 一起使用:

    [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class MyController : BaseController { }
    

    【讨论】:

      【解决方案5】:

      并发请求更多地依赖于浏览器,如果你触发假设 10 个并发请求到一个动作在 Mozilla 中使用 AJax 和使用 IE 8 相同,那么你会发现 Mozilla 具有触发一个请求的样式,等待其响应然后触发第二个等等...因为这是一个一个的基础,而在 IE 中 * 这一次会触发大约 6 个并发请求到服务器。

      所以并发请求也依赖于浏览器类型。

      【讨论】:

        【解决方案6】:

        我建议使用 jQuery 来满足您对 ajax 的需求以及 asp.net mvc,我专门使用它,而且非常简单。

        至于教程,我会看这个:http://docs.jquery.com/Ajax

        有很多选项可供使用,我还建议下载 firebug,这样您就可以查看从您的页面异步启动的请求,查看它们是否触发以及它们返回的内容等。

        和其他人一样,AJAX 请求是异步的,不会排队,完成后它们都独立返回,所以如果你在 firebug 中观看,很容易看到幕后和之前发生的事情调试器被命中

        【讨论】:

        • 我没有对此投反对票,但这并不准确:“AJAX 请求是异步的,不会排队”。虽然它们确实不会被客户端排队,但服务器确实会在启用会话状态时将它们排队。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        • 2021-10-14
        • 2011-08-23
        相关资源
        最近更新 更多