1

私はcometdサーバー用のjqueryクライアントを書いています(私はjquery.cometd.jsプラグインを使用しています)、そして私は考えられる最も単純なケースが機能しない理由のアイデアを使い果たしています。

cometdサーバーはapacheの背後にあり(したがって、この同じドメインで実行されています)、すべてのリクエストはuri http:// wwwhost/cometdから転送されます。

問題は、(handshake()を実行して)cometdに接続しようとすると、リクエストを/ cometdに直接送信するのではなく、/ cometd/handshakeに送信して404エラーが発生することです。テストしていた他のアプリを確認しましたが、dojoは常に/ cometdに接続し、メッセージ「ハンドシェイク」を送信しています。

jquery.cometdがなぜそうしているのか誰にも分かりますか?

これは私がapacheログで見ることができるものです:

- - [23/Mar/2010:17:59:30 +0100] "POST /cometd/handshake HTTP/1.1" 404 158 "http://wwwhost/" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100308 Iceweasel/3.5.8 (like Firefox/3.5.8)"

以下に私が使用しているコードを見つけることができます(それは多かれ少なかれ私が例から得たものです)。

(function($)
{
        var COMETD_URL = "http://wwwhost/cometd";
        var cometd = $.cometd;

        $(document).ready(function() {

                cometd.configure({
                        url: COMETD_URL,
                        logLevel: 'debug'
                });

                cometd.handshake();

        });
})(jQuery);

およびfirebugデバッグ:

Initial transport is Object {}
cometd.js (line 278)
Status disconnected -> handshaking
cometd.js (line 278)
Handshake sent Object { version="1.0", more...}
cometd.js (line 278)
Send Object { url="http://wwwhost/cometd/handshake", more...}
cometd.js (line 278)
POST http://wwwhost/cometd/handshake
POST http://wwwhost/cometd/handshake
404 Not Found 104ms

編集

私のサーバー実装はcometd以外のURIをサポートしていないようです。Jqueryは最後にメッセージのタイプを追加するため、ハンドシェイクを送信すると、メッセージは/ cometd / handshakeに送信されます。これは、一般に/ cometd/message_typeのように見えます。

cometd.jsコードでメッセージを送信している関数が見つかりました。この関数には、次の3つのパラメーターがあります。

function _send(messages, longpoll, extraPath)

この関数は、たとえば次のように呼び出されます。

 _send([message], true, 'connect');

つまり、私は常に/ cometd/handshakeで終わるということです。サーバーを修正するか、cometd.jsの追加URLをコメントアウトする必要があります。

4

2 に答える 2

1

私は同じことに遭遇しました。Mavenで実行している場合は機能しましたが、jettyでは直接機能しませんでした。

contexts/cometd.xml という名前のファイルを桟橋に追加しました。冗長に思えますが、私にとってはうまくいきました。

  <?xml version="1.0"  encoding="ISO-8859-1"?>
  <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"   "http://jetty.mortbay.org/configure.dtd">
  <configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/</Set>
    <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/server</Set>
  </configure>
于 2010-08-13T21:27:37.733 に答える
0

appendMessageTypeToURLfalse に設定してみてください

cometd.configure({
    url: COMETD_URL,
    logLevel: 'debug',
    `appendMessageTypeToURL`: false
});

しかし、ドキュメントによると、ハンドシェイクが失敗する別の理由がある可能性があります

ハンドシェイクは、いくつかの理由で失敗する場合があります。

  • サーバーの URL を間違えた
  • ロング ポール トランスポートを正常にネゴシエートできませんでした
  • サーバーがハンドシェイクを拒否した (たとえば、認証資格情報が間違っていた)
  • サーバーがクラッシュした
  • ネットワーク障害が発生しました
于 2010-03-23T17:22:25.440 に答える