Javascript 使用Internet Explorer时,jQuery JSONP请求经常失败

Javascript 使用Internet Explorer时,jQuery JSONP请求经常失败,javascript,jquery,python-2.7,jsonp,internet-explorer-10,Javascript,Jquery,Python 2.7,Jsonp,Internet Explorer 10,作为中型web应用程序的一部分,我们在 客户端的浏览器与基于Python的HTTP服务器进行通信 响应JSONP请求。我们注意到客户端代码是随机的 在Internet上运行时无法从服务器接收响应 浏览器9或Internet Explorer 10。随后的测试显示 即使在使用其他主要浏览器时,也会出现这种随机故障 在Microsoft Windows 7上运行,但非常罕见。最后,没有 当客户端浏览器在上运行时,会观察到此类故障 Linux操作系统 系统。 存储库包含客户机和服务器代码的简化版本 这

作为中型web应用程序的一部分,我们在 客户端的浏览器与基于Python的HTTP服务器进行通信 响应JSONP请求。我们注意到客户端代码是随机的 在Internet上运行时无法从服务器接收响应 浏览器9或Internet Explorer 10。随后的测试显示 即使在使用其他主要浏览器时,也会出现这种随机故障 在Microsoft Windows 7上运行,但非常罕见。最后,没有 当客户端浏览器在上运行时,会观察到此类故障 Linux操作系统 系统。 存储库包含客户机和服务器代码的简化版本 这说明了基本问题,并可用于帮助调试 问题其操作总结如下,并附有相关代码

Python HTTP服务器 文件夹
jsonp_server
包含我们的HTTP的简化版本 名为
test\u server.py
的文件中的服务器。它假设所有人都得到了回报 请求是jQuery JSONP请求。它使用回调参数响应JSONP请求,回调参数是一个JavaScript对象,其属性名为
result
,其值为 随机设置为
true
false

服务器实现为Python 2.7
BaseHTTPServer.HTTPServer
,带有一个作为
BaseHTTPServer.BaseHTTPRequestHandler

请求处理程序的
do\u GET()
方法如下所示:

def do_GET(self):
    try:
        #
        # Send OK and content type. 
        #
        self.send_response( httplib.OK )
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
        #
        # Send the JSONP response body. 
        #
        parsed_path = urlparse.urlparse(self.path)
        parsed_query = urlparse.parse_qs(parsed_path.query)
        callback = parsed_query['callback'][0]
        result = random.choice([True, False])
        self.wfile.write( "{0}({1})".format( callback, 
                                             json.dumps({ 'result' : result })) )
        return
    except IOError as errorInst:
        error_message = 'do_GET(): Internal server error while processing: {0} ({1})'.format(self.path, str(errorInst))
        self.send_error( httplib.INTERNAL_SERVER_ERROR, error_message )
        return 
测试01 下面提供了一个说明问题的简单测试 文件夹
test\u 01
。在运行Python HTTP服务器之后,您可以 只需在web浏览器中打开名为
test_01.html
的文件即可运行 测试。客户端JavaScript位于名为
test_01.js
。它只需向上的HTTP服务器发送一个JSONP请求
localhost
每秒一次。它会记录请求的数量 已成功和失败的号码。这些数字是 显示在浏览器中。相应的代码如下所示:

$(document).ready(function() {
    var test_count = 0 ;
    var pass_count = 0 ;
    var fail_count = 0 ;
    var test_interval_ms = 1000 ;
    var get_ajax_obj = function() {
        return {
            url: "http://localhost:8090/test_request.html", 
            timeout: 3000, 
            dataType: 'jsonp',
            success: function(data) {
                pass_count++ ;
                $('#test_result').text(data['result'] ? "True" : "False") ;
                $('#pass_count').text(pass_count) ;
                run_next_test() ;
            }, 
            error: function() {
                fail_count++ ;
                $('#fail_count').text(fail_count) ;
                run_next_test() ;
            }
        }
    } ;

    var run_next_test = function() { 
        setTimeout( function() {
            test_count++ ;
            $('#test_count').text(test_count) ;
            $.ajax(get_ajax_obj()); 
        }, test_interval_ms ) ;
    } ;

    run_next_test() ;
});
Test01结果 所有测试均在运行64位Windows 7的计算机上执行 最终与服务包1。期间使用了以下浏览器: 测试:

+-------------------------------+-----------------+
|           Browser             |     Version     |
+-------------------------------+-----------------+
| Microsoft Internet Explorer   | 10.0.9200.16721 |
| Google Chrome                 | 30.0.1599.101 m |
+-------------------------------+-----------------+
在运行期间的任何给定时间,只有一个浏览器运行客户端代码 这些测试。测试结果如下所示(当然,每次运行的结果各不相同):

如图所示,大量测试在运行Internet时失败 浏览器,而Chrome没有失败


知道为什么会发生这种情况吗?

IE可能正在缓存结果。尝试将缓存设置为false

$.ajax({
    url: 'http://localhost:8090/test_request.html',
    cache: false,
    dataType: 'jsonp',
    success: function(data) {
        console.log('success', data);
    },
    error: function (request, status, error) {
        console.log('error', error);
    }
});

尝试将服务器实现为多线程服务器。例如,如果您创建

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass

测试实现中的问题将消失

从您的
code
中删除
console.log
internetexplorer
@RohanKumar不支持它,因为它是在调试时出现的。将其从上面的列表中删除。它不在原始应用程序代码中。没有它的结果是相同的。jQuery的JSONP请求通过向URL追加查询字符串参数“=[TIMESTAMP]”来禁用缓存,如前所述。所以缓存不是这个问题的根源。为了确保这一点,我们尝试通过禁用每个请求以及所有jQueryAjax调用的缓存。结果是一样的。
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass