0

このWebサービスに接続する基本的なHTMLページを作成しようとしています: http : //wsf.cdyne.com/WeatherWS/Weather.asmxチュートリアルとコードサンプルを何時間もいじった後、私は完全に途方に暮れています。なぜこれが機能しないのか。(リクエストに応じて404を取得するか、ステータスがまったく表示されません。)これは、Soapを使用して同様のWebサービスに接続しているデモを拡張するための割り当ての一部であり、教授の例でも同じ問題が発生しています。良い..

私のコードは次のとおりです。

xmlHttpObj.open("POST", "http://wsf.cdyne.com/WeatherWS/Weather.asmx", true);
xmlHttpObj.setRequestHeader("Content-Type", "text/xml");
xmlHttpObj.setRequestHeader("SOAPAction", "http://ws.cdyne.com/WeatherWS/GetCityForecastByZIP");

var envelope = '<?xml version="1.0" encoding="utf-8"?> \n' +
               '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
               ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
               ' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
               '   <soap:Body> \n' +
               '       <GetCityForecastByZIP xmlns="http://ws.cdyne.com/WeatherWS/"> \n' +
               '           <ZIP>' + selectedZip + '</ZIP> \n' +
               '       </GetCityForecastByZIP> \n' +
               '   </soap:Body> \n' +
               '</soap:Envelope> ';

xmlHttpObj.onreadystatechange = UseResultsCallBack;
xmlHttpObj.send(envelope);

xmlHttpObjは有効なxmlHttpRequestオブジェクトでありselectedZip、郵便番号です。これはすべてクライアント側のコードであるため、おそらく何らかのクロスドメインの問題がありますが、この場合はそれが問題になるとは思いません...

4

1 に答える 1

1

あなたのコメント (質問には含まれていない非常に重要な情報が含まれています) に基づいて、クロスドメイン ajax リクエストを実行しようとしているようです。これは許可されていません。wsf.cdyne.comへの ajax リクエストを行うことができるのは、 のページのみwsf.cdyne.comです。ブラウザーが別のドメインと見なすため、ページ形式でさえcdyne.comajax 呼び出しをブロックされます。wsf.cdyne.com

これには 2 つの回避策があります。1 つ目は最新のソリューションである CORS (Cross Origin Resource Sharing) です。これには、wsf.cdyne.comウェブサイトがページ/サイトにデータへのアクセスを許可する必要があります。Access-Control-Allow-Originこれを行うには、ヘッダーを HTTP 応答に追加します。この変更なしでは何もできません。この変更により、特別なことを行う必要はありません。通常の ajax 呼び出しを行うだけで、ブラウザーがサイトとネゴシエートします。繰り返しますが、これはあなたがしなければならないことではありません。これは、wsf.cdyne.com管理者が行う必要があることです。そのため、管理者に連絡してください。

ただし、CORS プロトコルはあまり役に立たない場合があります。これは、ほとんどのブラウザーが、同一生成元ポリシーを破ることを許可することに対して厳しい制限を設けているためです。たとえば、W3C 仕様では、*誰でもサイトに対して ajax リクエストを作成できるオリジンが許可されていますが、一部のブラウザーはセキュリティ上の理由からそれをサポートしていません。また、*サポートされている可能性がありますが、ブラウザーによっては、ローカルでホストされているファイル (つまり、サーバーでホストされていないページ) での CORS の使用が許可されていません。サーバーに IP アドレスだけでなく、ドメイン名を指定することをさらに厳密に要求するものもあります。

CORS の詳細については、次のリンクを参照してください。

  1. https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

  2. クロスドメイン ajax

2 番目の回避策は、より伝統的な方法です。リクエストの作成を妨げているのは、Web ブラウザーです。JavaScript、Perl、PHP、C、Java などのプログラミング言語には、このような制限はありません。したがって、解決策は明らかです。ブラウザからリクエストを送信しないでください。サーバーにプロキシします。

選択した言語で書かれたプロキシ スクリプトは、Web ページと同じドメインでホストされている必要があります。繰り返しますが、これはローカル ファイルでは機能しないことを意味します。しかし、ローカル マシンで最小限の Web サーバーを実行することは、それほど難しいことではありません。

プロキシはサーバー上にある必要さえありません。たとえば、YUI は Flash アプレットを使用してクロスドメイン要求をプロキシします。私が間違っていなければ、Javaでも試すことができます。しかし、最近では Flash と Java の両方がセキュリティの脆弱性を封じ始めているため、この状況が永遠に続くわけではありません。ベンダーが両方のテクノロジーを放棄し始めていることは言うまでもありません。

私にとって最善の策は、単純に Web サーバーを実行し、ajax リクエストを送信するページのプロキシ スクリプトを作成することです。警告: 一般的なプロキシ スクリプトを記述しないでください。スパマーとボットネット オペレーターは、オープンな Web プロキシが自分たちの足跡を隠すために常に目を光らせています。

于 2013-03-18T15:33:13.487 に答える