2

我正在尝试从 javascript 调用 Web 服务。在 Internet Explorer 9 中正常工作,而 chrome 不工作。错误如下:

“OPTIONS http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl 400(错误请求)XMLHttpRequest 无法加载http://www.restfulwebservices.net/wcf/CurrencyService.svc?wsdl。不允许使用 Origin null通过访问控制允许来源。”

我留下代码来帮助我。谢谢。` 函数 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://文档发出请求,Chrome可能不允许它执行任何跨域 XHR,即使服务器返回一个 all-permissive Access-Control-Allow-Origin: *. 您应该运行本地服务器以通过 HTTP 访问您的文件,或者只是在不同的浏览器中进行测试。

于 2012-05-17T14:21:26.810 回答
0

如果您在不同的域中,则必须如上所述设置 Access-Control-Allow-Origin 标头。听起来您根本没有处理应用程序发出的 OPTIONS 请求。这只是当请求类型不是 GET 或 POST 时浏览器发出的附加请求。您将要做的就是返回具有正确 Access-Control-Allow-Origin 权限的标头,以让浏览器知道允许进行跨域请求。我不确定您在后台使用的是什么,但请参阅这篇文章以了解它是如何在 Rails 中完成的。 如何在不同的子域上从 Backbone 应用程序到 Rails 应用程序进行 POST、PUT 和 DELETE?

于 2012-05-17T14:47:16.280 回答