ArcGIS API for Javascript 使用缓冲区结果做query查询出现“esri.config.defaults.io.proxyUrl 尚未进行设置”错误
1、前言
在研究ArcGIS API for JavaScript时会遇到这样的问题,比如我们在做缓冲区分析时,用分析的范围作为空间查询query的参数,在执行结果中总是会看到“esri.config.defaults.io.proxyUrl 尚未设置”错误,但是我们手动绘制一个简单多边形作为输入参数则不会出现上述错误。
问题原因:
一般使用框选的时候对query.geometry,我们一般会赋予一个Extent变量,但是当我们需要用一个比如圆,或者点很多的不规则多边形的Polygon去查询时,就会出现esri.config.defaults.io.proxyUrl 尚未进行设置”错误
因为多边形(含有的point多)导致的web service的url的参数个数大于2048个,而我们这里采用的是get方式(最大的字符数为2048)不是post方式。所以我们需要一个proxy page做代理,通过代理使用post方式做查询,这样我们就不会受限于字符总数的限制了。
2、基础知识
post和get请求的区别?
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的,POST表示可能修改变服务器上的资源的请求。
(1).首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。
(2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
什么是代理页面?
代理页面通常部署在一台服务器和一个应用系统之间,通过启用代理,你可以使一个应用系统认可你的行为是安全的,从而避开认证,正常访问设置了安全验证的服务。实现代理的方式之一是令牌(Token),虽然令牌本身是不可见的,但是应用却可以通过基于令牌验证的验证,这是由于代理在后台处理了一个超过2048个字符的post请求完成的。另外,当一个应用和一个需要引入的资源之间存在跨域问题时,代理就可以帮助你解决跨域访问问题了。
当我们所请求的url总地址长度大于2048个字符,我们可以通过代理的方式将get请求通过代理转换为post请求,这样就避免了长度受限的问题。
使用ArcGIS API for JavaScript访问ArcGIS for Server 为何要使用proxy?
原因具体可以参照上述的介绍,在ESSI官方的JavaScript帮助中也有相关说明,大家可以自己阅
https://developers.arcgis.com/javascript/jshelp/ags_proxy.html
3、步骤
(1)、从GitHub中下载代理工具proxy https://github.com/Esri/resource-proxy/releases
目录中包含三个子目录,分别对应不同的Web服务器类型:
• DotNet – IIS服务器
• Java – Apache Tomcat 服务器
• PHP – Apache服务器
(2)、这里我们部署在IIS服务器下,将DotNet文件夹下的文件拷贝到IIS的wwwroot目录下。
说明:这里我仅拷贝了前3个文件过去。
(3)、在浏览器里访问localhost/prosy.ashx,如果返回以下结果,则说明配置成功。
说明:这里确保应用池的版本是4.0+,在本例中使用的是ASP.NET v4.0,如果返回错误请仔细检查应用程序池的问题。
(4)、编辑proxy.config文件,其中,mustMatch项推荐设置为“true”,因为这样就可以保证所有的请求都必须要通过设定的serverUrls的过滤。如果设置为“false”,这将会允许一些请求直接通过。
在应用示例中,我们要用到http://services.arcgisonline.com和http://sampleserver3.arcgisonline.com两个url,那么我们需要在proxy.config文件中加入这两个url。
说明:如果地址需要ArcGIS全球账户的认证,那么需要在url中加入用户名和密码信息。
例如:<serverUrl url="http://services.arcgisonline.com" UserName="UserName" PassWord ="PassWord" matchAll="true"/>
(5)、在应用程序中配置代理,添加到需要使用的代理的代码前即可
urlUtils.addProxyRule({
urlPrefix: "sampleserver3.arcgisonline.com",
proxyUrl: "/proxy.ashx"
});
另外一种方法:
esriConfig.defaults.io.proxyUrl = "";//其中proxyUrl是你部署到IIS下的路径即可。
esriConfig.defaults.io.alwaysUseProxy = false;
(6)、这里我们再次利用缓冲区查询的结果做query操作时就不会报相关操作了。
4、参考资料
https://developers.arcgis.com/javascript/
http://blog.csdn.net/lz576825608/article/details/7989391
http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
https://developers.arcgis.com/javascript/jshelp/ags_proxy.html
文章若无特殊说明均为原创,原创作品,允许转载,转载时请务必以超链接形式标明文章出处、作者信息和本声明。 博客:http://www.cnblogs.com/gis-luq 作者:gis-luq 邮箱:luqiang.gis@foxmail.com