Dojo.request for iteminfo-在Fiddler中返回代码200,但在浏览器中返回代码0

Dojo.request for iteminfo - return code 200 in Fiddler but 0 in the browser

本文关键字:返回 代码 浏览器 request Fiddler Dojo for iteminfo-      更新时间:2023-09-26

除了URL地址和我调用服务的iteminfo而不是层的addFeatures之外,我对dojo.request使用了与上一个项目中相同的代码。然而,我总是得到以下错误:

Unable to load http://foobar.com/arcgis/rest/services/MapServer/info/iteminfo status: 0

我在Firefox和IE中确认了这一点。Firebug或Visual Studio显示的状态总是0,尽管Fiddler显示的状态是200。当我把事情搞砸并在Fiddler中获得401时,它也会显示0。

所以,这是我的代码:

var promise = require('dojo/request').post(uri, {
    handleAs: "json",
    query: "f=pjson",        
    headers: {
        "X-Requested-With": null
    },
    //timeout: 60000,  //commenting this in and out changes nothing
    withCredentials: true
});
var res = promise.isResolved();
var rej = promise.isRejected();
var ful = promise.isFulfilled();
var can = promise.isCanceled();
var respres = promise.response.isResolved();
var resprej = promise.response.isRejected();
var respful = promise.response.isFulfilled();
var respcan = promise.response.isCanceled();
promise.response.then(
  //success
  function (response) {
    //something
  },
  //fail
  function (error) {
    //something different
  }
);

我希望输出为JSON,所以我添加了query选项;如果没有它,Fiddler将输出显示为HTML。我找到了一个答案,表明响应可能需要时间,但要么不是我的情况,要么需要比简单的timeout选项更复杂的东西。

我的所有测试变量(resrej…)都包含false。因此,代码中的请求似乎未解决、未完成等,但Fiddler返回了响应——我在这些网络艺术方面不够熟练,无法从中得出结论,所以我问了这个问题。

此外,我有一个模糊的印象,一些额外的标题应该是解决方案。我试着添加了accept(没有任何变化)和content-type(它在飞行前进行,Fiddler报告状态401)。

编辑:响应标头包含以下安全信息:

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin: http://localhost:30322 //origin for now
Access-Control-Allow-Origin: *

浏览器(出于安全原因)对跨域请求的要求越来越严格,可能会简单地拒绝加载跨域资源,即使它的状态为200,而是显示0。因此,如果您在dojo请求中使用的uri中的域与站点uri中的域名不同,这可能是问题所在。

请注意,只需添加一个端口号即可获得不同的域,这将被视为跨域请求。

为了解决这个问题,你可以在你的域上发出所有请求,并在你的dojo请求uri中添加一些东西,让你的web服务器将请求代理到外部服务器,例如:

    RewriteRule /arcgis/(.*)  http://foobar.com/arcgis/$1 [L,P]
    ProxyPassReverse /arcgis http://foobar.com/arcgis

否则,您必须手动指定来自站点域的跨域请求是可以的。foobar.com服务器需要将具有域值的HTTP标头Access Control Allow Origin添加到响应中,您的浏览器将接受它。添加具有值*的标头Access Control Allow Origin将接受来自任何域的跨域名请求,但显然不太安全。

我试图预先处理请求。发送的OPTIONS请求似乎还可以,但我们的服务器需要对其进行身份验证,导致错误401。我不想尝试破解OPTIONS请求,所以这实际上只能在服务器端解决。由于这一切的目的只是测试,在生产中,一切都将在服务器上或代理后面,我们决定使用一些肮脏的解决方法,比如现在将JSON缓存在文件中。

对于Access-Control-Allow-Origin还不够的原因,我认为POST可能是罪魁祸首。它与JSON-P和简单的CORS请求都不兼容。另外,我从来没有Access-Control-Allow-Methods响应标头,所以它们的缺失可能会阻止请求。不过我不确定。