ArcGIS API for JavaScript 4.x Proxy(代理)配置详细流程

前言

   ArcGIS API for JavaScript(后文简称 ags api)其实在17年底就接触过,当时配置过这个代理,觉得很难。因为当时还是做AE的(现在看来,那时候AE基本就是被淘汰了,Web端已经兴起),对前端一无所知,学习一个月效果不好,就又做了几个月的AE. 后来换了地方主要是做OpenLayers,直到20年初ags api又重新捡起来。所以现在让我看到这个代理还是点阴影的。

背景

  有一些点位数据,大概8万多条,后端已经用arcgis server发布。前端用 ags api实例化FeatureLayer调用,有个筛选的需求,我直接用了definitionExpression,

  

// Set the definition expression directly on layer instance to only display trees taller than 50ft
layer.definitionExpression = "HEIGHT > 50"; 

  类似上面,但是我的查询条件要复杂些,长度比这个长很多。

  

环境

   Windows Server 2012 R2

  ArcGIS API for js 4.18

问题

   或许就是因为查询条件过长的原因,导致查询失败,在前端筛选的时候可能缺失点位或者直接不显示点位。这个问题我是在前端network里面看到请求不到,也没见到请求方式和状态码,所以让人很迷。

 

 

   然后我去arcgis server服务里面查询,用post方式是正常的:

 

 

  但是用get方式直接跳转到一个错误页(这个问题之前是这样,现在已经没有了):

 

 

 

 

 

  经过我的查找和思考,大概就是因为查询条件太长导致的(至今我也不确定,只能去尝试),我还是尝试下加代理的方式。

配置过程

  以DotNet为例

  1.先到github下载文件

  下载后包括ASP.NET、Java/JSP、PHP三个文件夹,我用的IIS,所以只需要用DotNet部分。(在github上Detnet文件夹点击进去,里面也有详细配置教程)

  

 

 

 

   2.将DotNet文件夹拷贝到服务器C:\inetpub\wwwroot。(这个路径其实是任意的,放在这里不容易被误删,另外就是可以使用默认端口。我的默认端口被占用了,所以用了其它端口“8085”,但是为了不误导人,本教程就按照默认端口80写的)

  

 

 

   3.打开proxy.config文件,将“http://services.arcgisonline.com”改为自己arcgis server的地址,比如:"http://10.93.2.108:6080/arcgis/rest/services"

<?xml version="1.0" encoding="utf-8" ?>
<ProxyConfig allowedReferers="*"
             mustMatch="true" xmlns="proxy.xsd">
    <serverUrls>
        <serverUrl url="http://services.arcgisonline.com"
                   matchAll="true"/>
    </serverUrls>
</ProxyConfig>

<!-- See https://github.com/Esri/resource-proxy for more information -->

  4.确保已经开启了IIS,打开IIS管理器,右击DotNet,选择转换为应用程序

  

 

 

   5.验证是否通了

   访问http://10.93.2.108/DotNet/proxy.ashx?ping得到如下的结果,就说明代理是可用的

  

 

   如果访问这个页面出现错误页,比如错误码为403,可以尝试以下方案:

  ①这里是GitHub自述文件

  

 

   ②另外还有一个地址,忘记参考哪个解决的了

  

 

 

 然后验证跟自己发布的服务是否通了,访问"http://10.93.2.108/DotNet/proxy.ashx?http://10.93.2.108:6080/arcgis/rest/services/?f=pjson",如果看到类似结果,说明通了:

  

 

   至此,代理配置就完成了。

  6.前端使用

    

require(["esri/config"], function(esriConfig) {
esriConfig.request.proxyUrl=" http://10.93.2.108:8085/DotNet/proxy.ashx"; 
});

   7.前端调用结果

  在某条提问的回答下我看到这么一句话:“在代理文件中,没有强制走post的设置。使用代理,如果需要走post请求,代理会自动走post,这个过程是自动进行的。目前在js api中,只有在使用task对象或者直接通过request提交请求时,才可以通过RequestOptions参数设置请求强制走post,其他对应没有设置的设置。”,说明走不走代理是自动的过程,我在network请求中也能看到这种现象:

  初始请求,没有走代理

  

 

 

  筛选后,加了几个条件,开始走代理了,但我们可以看到,请求方式依然是GET,这点我没搞懂,说好的POST请求呢?

 

 

 

 

参考网址

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章