场景还原:
客户服务器网络情况说由内网映射到外网,实现了外网访问,在服务器内部网络是无法再访问到映射的外网IP;
ArcGIS Server安装在该服务器内,因GP打印服务内置在ArcGIS Server下,服务器内部只能通过内网访问地图服务,当客户在外网环境下登录系统后,GP打印服务获取到的地图服务都是外网的地址,导致打印失败。
需要解决的问题:
实际上需要解决的是如何将打印服务传入的地图服务参数地址由外网再转回到内网。
查询GP打印服务调用可以发现有个Web_Map_as_JSON参数,这个参数会传入需要打印的地图服务,因此我们可以考虑如何来修改这个参数的值。
因这个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;
}