3

このことはしばらくの間私を悩ませてきましたが、今のところウェブ上で理由/解決策を見つけることができません. セットアップは次のとおりです。

ブラウザーで実行されているファット JS クライアントがあり、内部システムに検索要求を送信しています。これらのリクエストはただの GET であり、特別なことではありません。それらは、検索結果が利用可能になったときに配置される URL を返します。

次に、指定された URL をポーリングして結果を取得し (5 分ごとなど)、データを処理してユーザーに提示します。その URL は、単なるプレーン テキスト (ASCII) である gzip 圧縮された結果ファイルを指しています。

現在...検索結果は多くの場合、数百行のテキスト内にありますが、時には数十万行のテキストがあり、時には7-10MB相当のテキスト(解凍後)があります。そして、ブラウザーが悲しいタブ ページを表示する場所です。

(このアプローチのセキュリティの問題を指摘する必要はありません。それらは多数あり、非常に強力です)。

特別なことは何もありません - を呼び出すだけです

$.ajax({
    url: '/cgi-bin/ajax_gz.cgi',
    type: 'POST',
    data: 'curl -k "' + self.url_res + '"',
    dataType: 'html',
    success: function (_data, _status, _xhr) {
        self.update_result(_data, _status, _xhr);
    },
    error: function (_xhr, _status, _error) {
        self.set_status(Status.ACK);
    },
    timeout: 5 * ONE_MINUTE
});

ここでajax_gz.cgi、単純なダムプロキシよりも精巧なものはありません(curlリクエストをリレーすることにより、JSが別のドメインからデータをプルできるようにするため):

#!/bin/bash
echo "Content-type: text/html"
echo "Content-encoding: gzip"
echo ""
/bin/bash

戻り値は確かに gzip された HTML であるため、そのヘッダーを設定しています。ajax() の構成でヘッダーを更新できると思いますが、これはより簡単なアプローチのようです。

successまたは関数が呼び出されることはerrorなく、タイムアウト (5 分) も問題ではありません。すべて LAN 上にあり、転送全体に 30 分もかかりません。

その URL をタブでまったく問題なく開くことができ、解凍された計画の ASCII テキストが表示されます。しかし、jQuery の ajax() を使用してデータを取得すると、悲しいタブ ページが表示されます (ほとんどの場合、「部分的なコンテンツ」HTTP 206 応答の場合のみ)。

私は何が欠けていますか?JSデバッガーで「ステップスルー」しようとしても、突然悲しいタブが表示され、デバッグセッションが強制終了されるだけなので、あまり役に立ちません。

更新: jQuery のコードをステップ実行し、readyState===4の関数で停止すると、応答をキャッチできました。それはHTTP 200全文でした(開始<html>タグから終了タグまで、1つの<pre>タグで間に108K行あります)。その応答を取得してthis値を「拡張」しようとすると、悲しいタブページが表示されました

4

2 に答える 2

0

あなたの bash プロキシ (うわー!) は gzip を実行せず、curl は通常 Content-Encoding: gzip で受信したものをすべて解凍するため、内部サーバーからの応答は gzip で返されると想定していますが、Content-Encoding はありません。ヘッダあり。

curl スクリプトが内部サーバーから 206 を取得しているようですね。サーバーは Range ヘッダーに応答して 206 のみを返す必要があるため、これは少し奇妙です。ただし、当然のことながら、gzip されたコンテンツの部分的な応答を取得し、それを 200 として Chrome に渡すことになります。もちろん、これで Chrome がクラッシュすることはありませんが、そこにバグがある可能性があります。

おそらく解凍してみてください:

#!/bin/bash
echo "Content-type: text/html"
echo ""
curl -k "`cat`" | gunzip

また、Ajax データ ソースを次のように変更することもできます。

data: self.url_res,

それが失敗した場合は、さらにデバッグするために -i を使用して curl から完全なヘッダーをキャプチャしてみてください。

于 2013-04-17T14:03:46.033 に答える
0

Chrome のメモリ制限が発生していると思います。このクロムによると、AJAX 呼び出しに対して 3000 文字の制限がある場合があります。

お気づきのように、開発者ツールはすべてを示していますが、それを読んで jQuery に返すと、何らかの形で限界に達します。応答をその制限未満に制限して、それが機能するかどうかを確認できますか? おそらく、別のブラウザで試してみませんか?

これが問題である場合は、結果を部分的に返すことを試みることができます。返品されたいくつかの部品は、制限を回避できる場合があります。

于 2013-04-06T06:32:58.013 に答える