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请求呢?
参考网址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了