• ArcGIS JS 使用Proxy之 Printing Tools unable to connect to mapServer


    ArcGIS JS使用Proxy.ashx将地图服务隐藏,并在微博服务器端增加了地图服务权限判断。

    Proxy.ashx做了如下设置,

    <serverUrl url="http://llcgreat"
                   hostRedirect="http://localhost:6080"
                   matchAll="true"
                   username="XCOneMapUser"
                   password="123456"
                   dynamicToken="true"
                   host="http://localhost:6080"/>

    ArcGIS JS中如下设置,将所有前缀为llcgreat的请求,统一转发至proxy.ashx中,由proxy根据配置文件进行转发响应。

    urlUtils.addProxyRule({
                urlPrefix: "http://llcgreat",
                proxyUrl: "/proxy.ashx"
            });

    上述配置后,相关地图服务则变为  https://llcgreat/arcgis/rest/services/WaterMap_Base/MapServer

    Printing Tools服务地址为:http://llcgreat/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task

    代码配置后,无法生成制图,显示错误如下:

    提示无法获取到地图服务。

    具体问题解析:

    在前端实例化地图时,用的是地图服务的伪地址,前端请求的时候,在urlUtil中做了相关配置,会将伪地址转发至web服务器的proxy中,由proxy根据配置去向ArcGIS Server请求相关地图服务数据并返回至前端。

    var print = new Print({
                        view: view,
                        // specify your own print service
                        printServiceUrl: printServiceUrl
                    });
    
                    // Add widget to the top right corner of the view
                    view.ui.add(print, "top-left");

    实例化制图输出widget时,使用view对象,而view对象中,相关地图服务都是使用伪地址,制图输出时,将此view对象所指向的地图服务的伪地址,一同发送至proxy,proxy再向ArcGIS Server请求。

    因此,ArcGIS Server拿到的是地图服务的伪地址,而ArcGIS Server端没有配置伪地址转发规则,也没有查到资料如何在Server端配置伪地址转发规则。因此,只能想办法在调用制图服务的时候,想办法在前端修改参数。

    查询相关材料,"esri/config"对象的 request中RequestInterceptor可以实现如下功能:

    主要设置before

    官网接口描述该功能主要是在发送ArcGIS Server请求的时候,可以修改请求的url或者option。经测试,如下功能可以实现在制图输出之前,修改请求的相关参数

    var regs = new RegExp("https://llcgreat", "g");
            var reg = new RegExp("http://llcgreat", "g");
    
            esriConfig.request.interceptors.push({
                // use the BeforeInterceptorCallback to check if the query of the
                // FeatureLayer has a maxAllowableOffset property set.
                // if so, then set the maxAllowableOffset to 0
                before: function (params) {
                    if (params.url.indexOf("Export%20Web%20Map%20Task") > 0) {
                        console.log(params);
                        if (params.requestOptions != undefined) {
                            if (params.requestOptions.query != undefined) {
                                if (params.requestOptions.query.Web_Map_as_JSON != undefined) {
                                    var s = params.requestOptions.query.Web_Map_as_JSON;
                                    s = s.replace(reg, "http://localhost:6080");
                                    s = s.replace(regs, "http://localhost:6080");
                                    params.requestOptions.query.Web_Map_as_JSON = s;
                                }
                            }
                        }
                    }
                }
            });

     经过上述代码处理,ArcGIS Server处理的是内网地址,ArcGIS Server生成的制图文件的路径也是内网地址,在浏览器端无法预览ArcGIS Server内网地址的附件。

    因此,需要将处理后的结果转换为浏览器端可以访问的地址,通过如下代码即可。

    after: function (response) {
                    if (response.url != undefined) {
                        if (response.url.indexOf("Export%20Web%20Map%20Task/execute") > 0) {
                            var results = response.data.results;
                            var url = results[0].value.url;
                            url = "/proxy.ashx?" + url;   //将浏览器返回的地址加上代理路径,浏览器端可以直接访问web服务器的代理,而代理可以通过内网地址去访问ArcGIS Server相关的资源
                            response.data.results[0].value.url = url;
                        }
                    }
                }

    另外,在proxy.config文件中,增加如下配置,使代理支持对该路径的访问

    <serverUrl url="http://localhost:6080/arcgis/rest/directories/arcgisoutput/Utilities/PrintingTools_GPServer" matchAll="true"></serverUrl>
  • 相关阅读:
    搭建一个开源项目8-安装RabbitMQ
    搭建一个开源项目7-Redis缓存安装部署
    Java连载134-连接JDBC
    Java连载133-ResultSet接口的其他方法
    搭建一个开源项目6-安装MySql
    搭建一个开源项目5-安装python双环境以及Maven工程管理工具
    搭建一个开源项目4-安装xFTP,xShell,JDK,NODE
    搭建一个开源项目3-两种方式安装git
    给IE9及其以下等不支持classList属性的浏览器,添加classList属性
    IE9 报错 script1004缺少“;”
  • 原文地址:https://www.cnblogs.com/DayDreamEveryWhere/p/11199440.html
Copyright © 2020-2023  润新知