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請求呢?

 

 

 

 

參考網址

  

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