場景還原:
客戶伺服器網絡情況說由内網映射到外網,實作了外網通路,在伺服器内部網絡是無法再通路到映射的外網IP;
ArcGIS Server安裝在該伺服器内,因GP列印服務内置在ArcGIS Server下,伺服器内部隻能通過内網通路地圖服務,當客戶在外網環境下登入系統後,GP列印服務擷取到的地圖服務都是外網的位址,導緻列印失敗。
需要解決的問題:
實際上需要解決的是如何将列印服務傳入的地圖服務參數位址由外網再轉回到内網。
查詢GP列印服務調用可以發現有個Web_Map_as_JSON參數,這個參數會傳入需要列印的地圖服務,是以我們可以考慮如何來修改這個參數的值。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSMBRVTxUkaOpXVq1kdGJTY2R2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4cDO5IzN1cTM2IDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
因這個GP服務是ArcGIS内置,在調用後就将自動建構Web_Map_as_JSON參數,可通過esriRequest.setRequestPreCallback來設定請求調用前的回調來修改。
示例代碼如下:
//列印功能按鈕觸發
on(savebutton, "click", lang.hitch(this, function (evt) {
//緩沖界面
MaskUtil.mask();
//設定請求前的回調
esriRequest.setRequestPreCallback(indexObj.myCallbackFunction);
var printTask = new PrintTask(ConfigData.printUrl);
var template = new PrintTemplate();
template.format = "PDF";
template.layout = indexObj._tukuo;
template.layoutOptions = {
authorText: $('#author').val(),
titleText: $('#title').val(),
scalebarUnit: "Miles",
//customTextElements: [
// { "RQ": "二\n零\n一\n七\n年\n九\n月" },
// { "KTKFYJY": "**\n勘\n探\n開\n發\n研\n究\n院" }]
};
template.preserveScale = true;
//template.outScale = 2000;
template.outScale = indexObj._map.getScale();
console.log(indexObj._map.getScale());
var params = new PrintParameters();
params.map = indexObj._map;
params.template = template;
params.outSpatialReference = indexObj._map.spatialReference;
printTask.execute(params, function (evt) {
MaskUtil.unmask();
indexObj._openprinturl = evt.url;
}, function (e) {
//在GP調用失敗後,判斷是否為内網映射到外網造成,如果是則觸發上面添加的請求前的回調函數繼續執行
if (ConfigData.printConfig && ConfigData.printConfig.isIntranetMapping)
esriRequest.setRequestPreCallback();
MaskUtil.cancel();
for (var eKey in e.details) {
console.warn(e.details[eKey]);
}
indexObj._layui.msg('列印出錯!', { icon: 2, offset: ['50%', '50%'] });
});
}));
//回調函數
myCallbackFunction:function(args) {
if (args.url.indexOf("execute") > -1) {
var jsonObj = JSON.parse(args.content.Web_Map_as_JSON);
var jsontxt = JSON.stringify(indexObj.setLocalIP(jsonObj));
args.content.Web_Map_as_JSON = jsontxt
}
return args;
},
//設定為内網IP
setLocalIP: function(strjson) {
arrayUtils.forEach(strjson.operationalLayers, function (ol) {
if (ol.id != "basemap") {
if (ol.url != null) {
ol.url = ol.url.replace(ConfigData.printConfig.outerNetIP, ConfigData.printConfig.innerNetIP);
}
}
}, this);
return strjson;
}