2

JavaScript から Web サービスを呼び出そうとしています。Internet Explorer 9 では正常に動作しますが、chrome は動作しません。エラーは次のとおりです。

"OPTIONS http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl 400 (Bad Request) XMLHttpRequest cannot load http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl . Origin null は許可されていませんAccess-Control-Allow-Origin によって。」

私を助けるためにコードを残します。ありがとう。` function SOAPClient() { this.wsdl = ''; this.async = true; this.action = ''; this.xml = '';

            SOAPClient.prototype.invoke = function(){
                var xhr;
                if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
                    xhr = new XMLHttpRequest();
                } else {// code for IE6, IE5
                    xhr=new ActiveXObject("Microsoft.XMLHTTP");
                }


                xhr.onreadystatechange=function() {
                    if (xhr.readyState >= 3){
                        alert ('ReadyState '+xhr.readyState+' - - Status '+xhr.status);
                        if(xhr.status == 200)
                            document.getElementById("txtResult").innerHTML=xhr.responseText;
                        else
                            document.getElementById("txtResult").innerHTML='Error';
                    }
                }
                xhr.open("POST", this.wsdl,this.async);
                xhr.setRequestHeader("SOAPAction", this.action);
                xhr.setRequestHeader("Content-Type", "text/xml");
                xhr.setRequestHeader("Connection", "close");
                xhr.send(this.xml);
                return false;
            }
        }
    </script> 
    <script type="text/javascript"> 
        var wsdl = 'http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl';
        var action = 'GetConversionRate';           
        var xml = '';
        var async = true;
        var response = '';

        function prueba(){              
            var client = new SOAPClient();
            client.wsdl = wsdl;
            client.action = action;
            client.xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.restfulwebservices.net/ServiceContracts/2008/01"><soapenv:Header/><soapenv:Body><ns:GetConversionRate><ns:FromCurrency>EUR</ns:FromCurrency><ns:ToCurrency>GBP</ns:ToCurrency></ns:GetConversionRate></soapenv:Body></soapenv:Envelope>';
            client.invoke();
            return false;
        }   
    </script>
</head>
<body>
    <p>Versión 2.5</p>
    <form name="form" action="#">
        Term: <input type="text" name="inputValue" method="post"/>
        <button onclick="prueba()">Search</button>
        <p id="txtResult"></p>
    </form>
</body>

`

4

2 に答える 2

3

まず、リクエストは次のいずれかである必要があります。

  1. 同一生成元ポリシーに従う(つまり、要求ドメイン == 受信ドメイン)、または

  2. Access-Control-Allow-Originクロスドメインの方法でそのサーバーにアクセスできるドメインとしてドメインをリストするヘッダーによって、サービスのページにアクセスすることを明示的に許可します。

さらに、file://ドキュメントからリクエストを行っているため、サーバーが all-permissive を返したとしても、Chromeはクロスドメイン XHR の実行を許可しない可能性がAccess-Control-Allow-Origin: *あります。HTTP 経由でファイルにアクセスするには、ローカル サーバーを実行するか、単に別のブラウザーでテストする必要があります。

于 2012-05-17T14:21:26.810 に答える
0

別のドメインにいる場合は、上記のように Access-Control-Allow-Origin ヘッダーを設定する必要があります。また、アプリケーションによって作成された OPTIONS リクエストをまったく処理していないようにも聞こえます。これは、リクエストのタイプが GET または POST ではない場合にブラウザによって行われる単なる追加のリクエストです。あなたがすることは、適切な Access-Control-Allow-Origin アクセス許可を持つヘッダーを返し、クロス ドメイン リクエストの作成が許可されていることをブラウザに知らせることだけです。バックグラウンドで何を使用しているかはわかりませんが、Rails でどのように行われたかについては、この投稿を参照してください。 バックボーン アプリから異なるサブドメインの Rails アプリへの POST、PUT、および DELETE に対応するにはどうすればよいですか?

于 2012-05-17T14:47:16.280 に答える