ArcGIS API For JavaScript(2)之解决内网映射外网后,ArcGIS Server内置的GP打印服务因IP问题导致打印失败

场景还原:

客户服务器网络情况说由内网映射到外网,实现了外网访问,在服务器内部网络是无法再访问到映射的外网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;
            }

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xizhjxust_GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值