使用JavaScript调用跨域asmx Web服务

时间:2012-01-11 13:47:54

标签: c# javascript web-services

我写了一个网络服务。我使用JavaScript调用此Web服务。我是从不同的域名调用它。为此,我在Web服务中添加了[System.Web.Script.Services.ScriptService]属性。从JavaScript我使用 XMLHttpRequest 调用该服务。我用Firefox测试过,一切都很好。但它不适用于IE。

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

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

  2. 我在网络服务中为return语句添加了以下行 - HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*"); HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); return result;

  3. 它在firefox中仍然可以正常工作。但是在IE8中(根据我的知识,XDomainRequest在IE的较低版本中不起作用)它显示错误( XDomainRequest.onerror )。

    我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

IE中问题的症结在于XDomainRequest不支持进行包含Content-Type标头的跨域请求所需的预先飞行。我相信这已在IE10中修复,但even IE9 doesn't fully support CORS

为了在不支持CORS的浏览器中可靠地向ScriptServices发出跨域请求,a server-side proxy(不幸的是)是您最好的选择。

答案 1 :(得分:0)

查看JSONP(带填充的json)。

关于JSONP的问题: jsonp with jquery

有更多关于它的信息:http://api.jquery.com/jQuery.ajax/

答案 2 :(得分:-1)

你的网络服务是通过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);
    }
});