使用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中不起作用。

经过一番搜索,我发现这是一个与跨域调用有关的问题。我已经浏览了这里发布的一些问题。然后我在我的代码中做了以下更改-

  1. 我现在使用XDomainRequest从javaScript调用该服务。

  2. 我在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)。

我是不是错过了什么?

使用JavaScript调用跨域asmx web服务

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);
    }
});