我以前曾多次问过这个问题,但是想过会试着改写,因为从来没有得到任何解决方案.
应用程序ajax调用在我的家用机器上工作正常,或者什么似乎是大多数其他网络.当它工作时,我可以看到Wireshark中的所有输出
当我的工作机器连接到我们的工作网络时,我在Wireshark中看不到任何东西.如果我指向在localhost上运行的服务器,该应用程序确实有效(但我在Wireshark中看不到任何内容,但这可能是因为它是localhost)
如果我在UWP容器之外运行应用程序,即我只是在同一台机器上运行,在同一个网络上运行,但是通过桌面浏览器运行(就像你为Cordova调试一样),它也可以运行.
所以它甚至在它进入网络之前就被阻止了,因为我们根本看不到Wireshark,所以这排除了主机无法访问,CORS等,因为它甚至没有被发送到服务器.
我可以通过Visual Studio在调试中运行它,并运行以下测试代码…
document.addEventListener('deviceready', callUrl, false); function callUrl() { console.log('callUrl'); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. console.log(xhr.readyState); if (xhr.readyState === DONE) { if (xhr.status === OK) console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } xhr.open('GET', 'https://httpbin.org/get'); xhr.send(null);
};
onreadystatechangeis调用两次,xhr.readyState前2然后4.
状态始终为0.
我怎样才能诊断阻塞这个的是什么?我完全不知道.这是低级别的东西,但怎么看?我也浏览了Windows事件日志,但什么都找不到.
Ajax调用只返回0,带有空白描述.我们的网络管理员只是说我的应用程序有问题(我尝试了多个Cordova应用程序,包括基本的测试应用程序)
在此先感谢您的帮助.
[EDIT1]
为了回应@Xavier的评论,我在AppxManifest.xml中的所有内容(我从我构建的.appxupload文件中提取的)都是
<Capabilities> <Capability Name="internetClient" /> </Capabilities>
有一些关于here功能的文档,我们有以下内容(位于页面底部).
The following capabilities are unavailable when deploying your Remote Mode application to the Windows Store: Enterprise Authentication (enterpriseAuthentication) Shared User Certificates (sharedUserCertificates) Documents Library (documentsLibrary) Music Library (musicLibrary) Pictures Library (picturesLibrary) Videos Library (videosLibrary) Removable Storage (removableStorage) Internet client/server (internetClientServer) - note that internetClient is still permitted Private network client/server (privateNetworkClientServer)
我不确定我们是否在Visual Studio(config.xml)中设置了这些,但上面似乎也说这些中的一些不能使用?
internetClient应该足够吗(我只想作为客户端呼叫服务器,而不是充当服务器).
此外,这似乎足以在大多数网络上工作,除了我的工作..
[EDIT2]
回应关于CSP的回复……
有关此here的讨论.我在Visual Studio中创建的测试Cordova应用程序确实具有以下功能:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
令人惊讶的是,我没有在我的Ionic index.html中看到这一点,但也许这是因为它使用的是白名单插件?
我的Ionic应用程序在config.xml中有以下内容
<access origin="*" /> <allow-intent href="http://*/*" /> <allow-intent href="https://*/*" /> <allow-intent href="tel:*" /> <allow-intent href="sms:*" /> <allow-intent href="mailto:*" /> <allow-intent href="geo:*" /> <allow-navigation href="http://localhost:8080/*" /> .... <plugin name="cordova-plugin-whitelist" spec="^1.3.1" />
如果ajax甚至有一些错误说它与CSP有关,那将是很好的,如果它就是这样,但我们什么都没得到.
再一次,这个问题只出现在我的工作网络上(无论是有线还是我们的WIFI),这很奇怪.如果我在另一个连接上运行确切的机器(例如Surface平板电脑)(例如将它连接到我的手机电池),那么一切都按预期工作.所以它必须是与网络(或防火墙可能)有关的一些设置,我也觉得奇怪,因为我至少会在Wireshark中看到一些东西.
很高兴能够“调试”ajax调用,并查看它失败的地方.
[编辑3]
阅读其中一条评论后,我用小提琴手看看我能看到什么,我做了……
它甚至报告200(这是不正确的),我的请求仍然失败.
根据 this,您需要请求privateNetworkClientServer功能才能与本地网络通信.请注意,此功能仅在您的应用程序配置为local mode时才有效(如果在远程模式下使用此功能,您的应用程序将从商店中被拒绝).
要启用本地模式,您需要设置< preference name =“WindowsDefaultUriPrefix”value =“ms-appx://”/>在你的cordova config.xml中.
请注意,本地模式可能会导致其他问题,因为您无法使用例如本地模式下的内联脚本(CSP违规)