我正试图在ripple模拟器上运行我的phonegap应用程序,并在jquery中使用ajax方法从webservice.asmx调用方法,但出现了cors错误:
XMLHttpRequest无法加载https:\rippleapi.herokuapp.com\xhr_proxy?tinyhippos_apikey=ABC&tinyhippos_rurl=http://www.my-domain.com/WebService.asmx/selectData。请求的资源上不存在"访问控制允许来源"标头。因此,不允许访问源"http:\localhost:4400"。响应的HTTP状态代码为503。
- 已经在服务器端给出了cors(web.config):
<system.webServer>
<defaultDocument>
<files>
<clear />
<add value="index.aspx" />
<add value="WebService.asmx"/>
</files>
</defaultDocument>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="Content-Type"/>
</customHeaders>
</httpProtocol>
</system.webServer>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
</system.web>
<system.serviceModel>
-
我的AJAX方法:
$.ajax({
类型:"POST",
crossDomain:true,
网址:"http://www.my-domain.com/WebService.asmx/selectData",
数据:JSON.stringfy(campaignData),
contentType:"application/json;charset=utf-8",
dataType:"json",
成功:函数(消息)
{
var响应=消息.d
var resultLoop=$.parseJSON(响应)
console.log(响应)
},
错误:函数(xhr,ajaxOptions,thrownError)
{
$.mobile.加载("隐藏")
alert("status:"+xhr.status+"thrownError:"+thrownError+"ajaxOption:"+ajaxOptions)
}
});
无法解决这个问题,不知道我在哪里做错了什么或错过了什么我必须更改代码,以便它与服务器通信并获取数据。
在ripple模拟器上运行phonegap应用程序,将跨域代理设置更改为禁用,并且有效。
您可以在服务器端代码中添加允许的方法(post、delete等),也可以使用chrome插件Access Control Allow Headers。类似于php
header("Access-Control-Allow-Origin: http://localhost:8080");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE, PUT");
header("Access-Control-Allow-Credentials: true");
您可以使用jsonp进行跨域ajax恢复,如下所示:
$.ajax({
type:"POST",
url: "http://www.my-domain.com/WebService.asmx/selectData",
data: JSON.stringify(campaignData),
contentType: "application/json;charset=utf-8",
dataType:"jsonp",
success: function(msg)
{
var response=msg.d;
var resultLoop=$.parseJSON(response);
console.log(response)
},
error: function(xhr, ajaxOptions, thrownError)
{
$.mobile.loading('hide');
alert("status :"+xhr.status +" thrownError :"+ thrownError +" ajaxOption : "+ ajaxOptions);
}
});
还有一件事,你必须在web方法"回调"中添加一个参数,服务器端的字符串类型为:
selectData(string callback){
var JSONString = new JavaScriptSerializer().Serialize("");
//JSONString is a json format
return callback+"( "+JSONString + " )";
}
有关更多详细信息,请参阅http://www.niceonecode.com/Q-A/JAVAScript/AJAX/Cross-domain-ajax-request-to-a-json-file-using-JSONP/20154