使用JavaScript调用跨域asmx web服务
本文关键字:asmx web 服务 JavaScript 调用 使用 | 更新日期: 2023-09-27 18:20:11
我已经编写了一个web服务。我使用JavaScript调用此web服务。我从不同的域调用此。为此,我在web服务中添加了[System.Web.Script.Services.ScriptService]
属性。在JavaScript中,我使用XMLHttpRequest调用该服务。我用Firefox测试了一下,一切都很好。但它在IE中不起作用。
经过一番搜索,我发现这是一个与跨域调用有关的问题。我已经浏览了这里发布的一些问题。然后我在我的代码中做了以下更改-
-
我现在使用XDomainRequest从javaScript调用该服务。
-
我在web服务中的返回语句之前添加了以下行-
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*"); HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); return result;
它在firefox中仍然运行良好。但在IE8中(据我所知,XDomainRequest在IE的较低版本中不起作用),它显示错误(XDomainRequest.onerror)。
我是不是错过了什么?
IE中问题的关键在于XDomainRequest不支持进行包含Content-Type标头的跨域请求所需的预飞行。我相信这在IE10中是固定的,但即使是IE9也不完全支持CORS。
为了在不太支持CORS的浏览器中可靠地向ScriptServices发出跨域请求,服务器端代理(不幸的是)是您的最佳选择。
查看JSONP(带填充的json)。
关于JSONP的问题:带有jquery 的jsonp
有关于它的更多信息:http://api.jquery.com/jQuery.ajax/
您的web服务运行在HTTP上,对吗?
我不建议使用原生XMLHttpRequest来进行ajax请求,也许你应该使用Jquery来完成这项工作,我一直都是这样做的,并且适用于所有现代浏览器:
即:
function Activate(EmailId, controle) {
$.ajax({
type: "POST",
url: "/Page/Method",
data: "&EmailId=" + EmailId,
success: function (message) {
$(controle).text(message);
}
});
}
编辑:要进行跨域请求,您可以使用James Padolsey插件,并执行以下操作:
$('#container').load('http://google.com');
$.ajax({
url: 'http://news.bbc.co.uk',
type: 'GET',
success: function(res) {
var headline = $(res.responseText).find('a.tsh').text();
alert(headline);
}
});