当前位置 : 主页 > 手机开发 > cordova >

Cordova:如何诊断ajax不适用于UWP(Windows应用商店)应用程序

来源:互联网 收集:自由互联 发布时间:2021-06-10
我有一个简单的Cordova应用程序,在构建时,作为 Windows UWP应用程序运行时,ajax调用在某种程度上被阻止了我的工作网络. 我以前曾多次问过这个问题,但是想过会试着改写,因为从来没有得到
我有一个简单的Cordova应用程序,在构建时,作为 Windows UWP应用程序运行时,ajax调用在某种程度上被阻止了我的工作网络.

我以前曾多次问过这个问题,但是想过会试着改写,因为从来没有得到任何解决方案.

应用程序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]

阅读其中一条评论后,我用小提琴手看看我能看到什么,我做了……

enter image description here

它甚至报告200(这是不正确的),我的请求仍然失败.

根据 this,您需要请求privateNetworkClientServer功能才能与本地网络通信.

请注意,此功能仅在您的应用程序配置为local mode时才有效(如果在远程模式下使用此功能,您的应用程序将从商店中被拒绝).

要启用本地模式,您需要设置< preference name =“WindowsDefaultUriPrefix”value =“ms-appx://”/>在你的cordova config.xml中.

请注意,本地模式可能会导致其他问题,因为您无法使用例如本地模式下的内联脚本(CSP违规)

网友评论