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.iarcgis.com/?p=1000


同步博客:http://www.cnblogs.com/gis-luq​
作者:gis-luq 
郵箱:[email protected]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章