在Ajax调用中实现响应头

时间:2013-03-21 15:35:23

标签: ajax asp.net-mvc jquery cross-domain crossdomain.xml

下面是我试图通过Ajax调用进行的跨域调用。我们使用的网络服务仅返回XML,因此我无法将jsonp用作dataType。正如我在下面写的那样,我在Chrome的调试器中收到以下错误:

Uncaught ReferenceError: Request is not defined

以下是代码:

function GetProgramDetails() {
    var URL = "http://quahildy01/xRMDRMA02/xrmservices/2011/OrganizationData.svc/AccountSet?$select=AccountId,Name,neu_UniqueId&$filter=startswith(Name,\'" + $('.searchbox').val() + "\')";
    var sourceDomain = Request.Headers["Origin"];
    var request = $.ajax({
        type: 'POST',
        beforeSend: function(request){
            request.setRequestHeader("Access-Control-Allow-Origin", sourceDomain)
        },
        url: URL,
        contentType: "application/x-www-form-urlencoded",
        crossDomain: true,
        dataType: XMLHttpRequest,
        success: function (data) {
            console.log(data);
            alert(data);
        },
        error: function (data) {
            console.log(data);
            alert("Unable to process your resquest at this time.");
        }
    });
}

编辑

我已尝试过此代码的以下版本,并且在错误消息中没有看到任何不同之处。这是在企业环境中使用的,因此,由于服务器上的安全功能,它可能无法工作吗?我是Ajax的新手,所以我不知道这是在100%的时间内工作还是仅在大多数设置中工作。

        beforeSend: function (request) {
            request.setRequestHeader("Access-Control-Allow-Origin: *")
        },


        beforeSend: function (request) {
            request.setRequestHeader("Access-Control-Allow-Origin: ", "http://localhost:55152")
        },

        beforeSend: function (request) {
            request.setRequestHeader("Access-Control-Allow-Origin", "http://localhost:55152")
        },

        beforeSend: function (request) {
            var sourceDomain = request.Headers["http://localhost:55152"];
            request.setRequestHeader("Access-Control-Allow-Origin: ", sourceDomain)
        },

        beforeSend: function (request) {
            var sourceDomain = location.protocol + '//' + location.host;
            request.setRequestHeader("Access-Control-Allow-Origin: ", sourceDomain)
        },

2 个答案:

答案 0 :(得分:1)

这是您的问题:var sourceDomain = Request.Headers["Origin"];您尚未使用大写Request定义R

问题的关键在于跨域请求。这是可能的,并且您在正确的轨道上,但Access-Control-Allow-Origin是在服务器上设置为响应头的东西,而不是客户端通过XHR作为请求头发送的东西。见https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Access-Control-Allow-Origin

请参阅HTML5 Boilerplate .htaccess作为如何在Apache https://github.com/h5bp/html5-boilerplate/blob/master/.htaccess上进行设置的示例,并注意浏览器限制https://www.bionicspirit.com/blog/2011/03/24/cross-domain-requests.html - 特别是这在IE7中不起作用且IE没有' t支持通配符*

尝试模仿jsonp(从服务器返回可执行的JavaScript代码)可能有一些聪明的编码,但这会更难 - Using JSONP when returning XML

此外,如果数据是敏感的,那么您可能不希望在没有私钥方案的情况下进行任何类型的跨域请求,因为我不确定原始请求标头是否可以被欺骗。另一种方法是为您的网站建立连接,以便在后端而不是前端共享数据。

此外,JavaScript函数名称不是大写的,除非它们是构造函数。

答案 1 :(得分:0)

beforeSend: function(request){
    var sourceDomain = request.Headers["Origin"];
    request.setRequestHeader("Access-Control-Allow-Origin", sourceDomain)
},

您尝试在创建之前访问请求,从而抛出未定义的错误。请求是传递给beforeSend()回调函数的jqXHR对象。