2012-02-28 38 views
5

我正在调查本地(file:// access)html应用程序的.NET WCF域服务的跨域使用情况。该应用程序正在使用jQuery进行AJAX调用。jQuery.Ajax“访问被限制的URI被拒绝”的解释?

如果服务器上没有身份验证(即使用匿名身份验证),我已经使用CORS“Access-Control-Allow-Origin:*”头以JSON格式成功检索了JSON格式的数据,并且没有头。

现在我试图了解身份验证和CORS头与JSON(而不是JSONP)格式数据的位置时的行为。

下面的jQuery代码会向服务器发送一个请求,服务器又会响应“HTTP/1.1 401 Unauthorized”。

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    data: myData 
}); 

下面的jQuery代码不会向服务器发出请求,并立即抛出一个异常“访问受限制的URI被拒绝”,代码1012

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData 
}); 

我的理解,并期望第一种情况。任何人都可以向我解释第二种情况下的例外情况吗?我本来希望至少可以提出这个请求。

编辑:Grrr,这是在FF 10.0.2。 Chrome似乎按照我的预期行事,这是FF问题吗?

回答

0

你可以使用一个回调函数来解决这个问题: http://docs.jquery.com/Ajax/jQuery.ajax#options

+0

我意识到我可以用jQuery.ajax回调函数之一来捕获错误,或者使用带有JSONP的回调函数 - 那是您的意思吗?我的问题真的只是为什么(也许只是Firefox)没有提出请求,而是在这种情况下引发错误。 – Chris 2012-02-28 11:26:49

5

如果您使用的凭据,如饼干或HTTP基本身份验证的用户名/密码字段在跨域请求,你还需要设置“withCredentials “XHR上的标志为true。在jQuery中,这是通过$ .ajax调用的xhrFields属性完成的。更改您的代码来读取

$.ajax({ 
    url: myUrl, 
    dataType: 'json', 
    cache: false, 
    complete: function() { /* do stuff */ }, 
    timeout: 5000, 
    username: "chris", 
    password: "password", 
    data: myData, 
    xhrFields: { withCredentials: true } 
}); 

此外,在另一端的服务器无法使用“*”与证书的访问控制允许来源头。而是必须提供发送给它的Origin标头的精确匹配。