【问题标题】:What happens when there is network request time out during AJAX request to ASP.NET MVC Action在向 ASP.NET MVC 操作的 AJAX 请求期间网络请求超时时会发生什么
【发布时间】:2016-12-10 13:26:59
【问题描述】:

如标题所述,我想知道当 AJAX 请求被发送到控制器操作时会发生什么,并且在此期间,在请求完成之前会发生几毫秒的网络超时。

Reply from <Server IP>: bytes=32 time=31ms TTL=122
Request timed out
Reply from <Server IP>: bytes=32 time=28ms TTL=122

考虑到超时仅发生几毫秒,这会对我的 AJAX 请求产生什么影响?

这是我们在应用程序中面临的问题的延续,正如SO question 中所述,我想知道它们是否有某种关联。

我搜索过类似的问题,但找不到任何有用的东西。

编辑:除了对 AJAX 的影响外,是否会影响 action 方法的行为(服务器)?

【问题讨论】:

    标签: asp.net ajax asp.net-mvc networking asp.net-mvc-2


    【解决方案1】:

    无论超时是否仅发生几毫秒或更长时间,请求都会失败。您的 AJAX 请求的 success 回调函数将不会被执行,请求将以 complete 回调函数的执行结束。默认情况下,所有 AJAX 请求都会有 0ms 的超时时间(无限制),但会达到浏览器的默认超时时间。

    当 AJAX 请求超时时,将调用 error 回调函数。此函数的第二个参数是描述错误类型的字符串,在这种情况下,它将具有值timeout。您可以通过处理此回调函数和可选地在 AJAX 请求正文中指定超时值(如果未指定,则使用默认值)来处理请求超时:

    $.ajax({
        ...
        timeout: 5000, //specify the timeout value in milliseconds
        error: function(jqXHR, textStatus, errorThrown) {
            if(textStatus==="timeout") {
               //code to execute when timeout occurs
            } 
        }
    });​
    

    此外,您还可以在complete 回调函数中检查请求是否超时(以与上所示类似的方式),方法是检查第二个参数,它是一个字符串,如果它的值为timeout请求超时。

    另外,请注意:

    超时时间从 $.ajax 调用开始;如果有几个其他请求正在进行,并且浏览器没有可用的连接,则请求可能会在发送之前超时。

    请求超时通常要么保留其默认值,要么使用 $.ajaxSetup() 设置为全局默认值,而不是使用超时选项覆盖特定请求。

    我建议您使用另一种 HTTP/s 流量监控工具,例如 fiddler 来找出第二个请求背后的奥秘。

    更多信息:jQuery ajax documentation

    【讨论】:

    • 感谢您的详尽回答。至于您关于流量监控的建议,fiddler/chrome 网络选项卡仅显示来自客户端的单个请求。
    【解决方案2】:

    请求将“失败”,这意味着它将进入您的 AJAX 请求的onError 状态。然后状态码将为 0,因为服务器没有响应来确定真正的状态码(例如 200 OK 或 500 Internal Server Error)。

    【讨论】:

      【解决方案3】:

      如果超时,您的成功回调将不会执行,因此您必须在客户端编写错误回调来处理此类问题。

      您必须在超时的情况下从服务器端引发异常,以便它将作为错误返回给客户端,这是您可以处理超时的一种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 2015-02-14
        • 2011-07-11
        • 1970-01-01
        • 2018-06-26
        相关资源
        最近更新 更多