1、前言:
在IE8中使用用圆形或椭圆形进行缓冲区查询时,会报如下错误:esri.config.defaults.io.proxyUrl 尚未进行设置。如果向启用了 CORS 的服务器发出请求,请将域推送到 esri.config.defaults.io.corsEnabledServers。但是我们手动绘制一个简单多边形作为输入参数则不会出现上述错误。
2、原因:
一般使用框选的时候对query.geometry,我们一般会赋予一个Extent变量,但是当我们需要用一个比如圆,或者点很多的不规则多边形的Polygon去查询时,就会出现esri.config.defaults.io.proxyUrl 尚未进行设置”错误。因为多边形(含有的point多)导致的web service的url的参数个数大于2048个,而我们这里采用的是get方式(最大的字符数为2048)不是post方式。所以我们需要一个proxy page做代理,通过代理使用post方式做查询,这样我们就不会受限于字符总数的限制了。
3、post和get请求的区别
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的,POST表示可能修改变服务器上的资源的请求。
(1)Get方式:首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。
(2)Post方式:理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
(3)代理页面:通常部署在一台服务器和一个应用系统之间,通过启用代理,你可以使一个应用系统认可你的行为是安全的,从而避开认证,正常访问设置了安全验证的服务。实现代理的方式之一是令牌(Token),虽然令牌本身是不可见的,但是应用却可以通过基于令牌验证的验证,这是由于代理在后台处理了一个超过2048个字符的post请求完成的。另外,当一个应用和一个需要引入的资源之间存在跨域问题时,代理就可以帮助你解决跨域访问问题了。
当我们所请求的url总地址长度大于2048个字符,我们可以通过代理的方式将get请求通过代理转换为post请求,这样就避免了长度受限的问题。
3、解决
3.1 下载代理包
https://github.com/Esri/resource-proxy/releases,内如如下:
1.1.0
@bsvensson bsvensson released this on 6 Nov 2015 · 8 commits to master since this release
Added
Support for 10.3 tokens
Support for federated services
Support for hostRedirect to use aliased domains
Added "?ping" for easier testing
(DotNet) Support for Windows authentication
目录中包含三个子目录,分别对应不同的Web服务器类型:
(1)DotNet – IIS服务器
(2)Java – Tomcat 服务器
(3)PHP – Apache服务器
3.2 在IIS上部署
在IIS服务器下,将DotNet文件夹下的四个文件拷贝到IIS的wwwroot目录下,内如如下(Web.config文件可以只拷贝里面部分内容到项目的web.config文件夹中)。
proxy.ashx,proxy.config,proxy.xsd,Web.config
在浏览器里访问localhost/prosy.ashx,如果返回以下结果,则说明配置成功。
修改配置文件proxy.config,加入如下内容:
<?xml version="1.0" encoding="utf-8" ?> <ProxyConfig allowedReferers="*" mustMatch="true"> <serverUrls> <serverUrl url="http://services.arcgisonline.com" matchAll="true"/> <serverUrl url="http://59.75.119.108:6080/arcgis/rest/services" matchAll="true"/> <serverUrl url="http://localhost:6080/arcgis/rest/services" matchAll="true"/> </serverUrls> </ProxyConfig> <!-- See https://github.com/Esri/resource-proxy for more information -->
说明:如果地址需要ArcGIS全球账户的认证,那么需要在url中加入用户名和密码信息。
例如:<serverUrl url="http://services.arcgisonline.com" UserName="UserName" PassWord ="PassWord" matchAll="true"/>
在应用程序中配置代理,添加到需要使用的代理的代码前即可:
esriConfig.defaults.io.proxyUrl = "proxy.ashx"; esriConfig.defaults.io.alwaysUseProxy = false;