我正在使用ajax调用一个基于WCF REST的服务。
ajax方法在页面加载之前被调用。我希望在ajax请求的头部发送一个"Token“。在小提琴手中,我看到的是:
1.)头中没有token的服务请求。(AJAX调用失败)2.)头中有token的相同服务的请求。(传递AJAX调用)
在那之后,在chrome和safari上一切都可以正常工作。但在IE10和Mozilla上只有一个服务调用。因此,IE10和Mozilla中的服务调用失败,因为请求的头部中没有令牌。
这是我调用的方法:
function callservice (method, serviceUrl, params, successHandler, errorHandler) {
$.ajax({
crossDomain: true,
type: method,
url: serviceUrl,
beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Authorization", Token); },
contentType: "application/json; charset=utf-8",
dataType: "json",
success: successHandler,
error: errorHandler
});
function photos(data) {
alert(data);
console.log(data);
};
}我控制Web服务和应用程序(调用此Web服务)。当应用程序和web服务都托管在本地host.In上时,如果只有一次成功的服务调用,则不会出现此问题。但是当有一个跨域调用时,有两个AJAX调用。
我的问题是,为什么AJAX请求不在第一次尝试时发送令牌?为什么只在第二个AJAX调用中发送令牌?
任何形式的帮助都将不胜感激。
发布于 2012-12-28 23:09:48
问题出在CORS.Earlier上,浏览器不允许对与客户端不同的域发出ajax请求,因为它被认为是安全的。只要服务器与client.So合作,浏览器就可以发出跨域ajax请求。这就是当有来自浏览器的跨域请求时实际发生的情况:
1.)首先,浏览器向服务发送“预检”请求,以从WCF服务收集授权信息(在我的例子中,这是一个头方法为“OPTIONS”的请求)。作为回报,Web服务发送Access Control Allow Origin作为其响应header.And的一部分,由于此请求而显示在fiddler上的错误是HTTP500WCF AJAX请求在数据字段中没有任何内容,因为它只是查找error.This服务的授权详细信息的一种方式。
2.)Chrome和Safari随后向网络服务发出了第二个请求,因为它们已经获得了service.Whereas Firefox的授权细节,并且IE不愿意向该服务发出第二个ajax请求,因为飞行前请求存在HTTP500错误。因此,Chrome和Safari都能够与该服务进行通信。
因此,解决方案是修改来自WCF服务的响应,以防有“印前检查请求”发送给它。我修改了服务发送的响应,以防有“印前检查请求”发送HTTP 200 OK响应。这允许IE和Mozilla等浏览器在印前检查请求后发送实际请求。
这是我提到的其中一个来源:http://www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm
希望这对面临同样问题的人们有所帮助。
发布于 2012-11-29 05:51:25
跨域呼叫在同源策略下。默认情况下,您不能进行调用。您需要使用CORS或JSONP或代理。
发布于 2012-11-29 05:42:01
XMLHttpRequest:除非他们更改了它,否则在MS Explorer中,您将需要使用ActiveXObject("Microsoft.XMLHTTP")。对于我在普通JS中进行的ajax调用,我使用下面这行代码来根据浏览器类型创建对象:
if (window.XMLHttpRequest){
//for most BRowsers
r = new XMLHttpRequest();
} else{
//for Explorer
r = new ActiveXObject("Microsoft.XMLHTTP");
}然后将您的beforesend应用于这里创建的对象(在我的例子中是r)。我真的相信这是你和EI的问题。但没有经过测试。
https://stackoverflow.com/questions/13614802
复制相似问题