ArcGIS在线编辑与跨域问题
1、问题描述:本人用的版本为ArcGIS10.0 ArcServer10.0 ArcSDE9.3 oracle11g 做在线编辑功能,引用的是官网的例子https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=ed_default_editingwidget,前提安装好server并且与数据库连接。首先将本地数据导入DatabaseConnections数据库中,然后将初始mxd文档中的数据源替换成数据库中的数据,接着另存为mxd文档,然后在catalog中发布另存的mxd为featureserver,注意这里做在线编辑功能必须发布featureserver服务,mapserver只能浏览不能做编辑,所以在服务发布页面需要勾选feature access(图1),若报configuration错误通常都是数据源没有替换成数据库中数据,还是使用本地数据导致(图2)。
(图1)
(图2)
2、服务发布后开始调用,mapserver加载较快但是不能用作编辑,featureserver加载较慢但是可以编辑,因此为了同时达到加载快又能编辑的目的,我们将mapserver与featureserver同时添加进地图,再将featureserver的透明度设置为0,即可,代码如下(图3)
(图3)
3、接下来就可以在网页上浏览你发布的地图了,然而你会发现运行时会报错(XMLHttpRequest cannot load http://server/arcgis/rest/info?f=json. Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin),那么使用的代码都一样,为什么官网发布的地图服务就可以用,调用我们自己发布的服务就不可以用呢?这就涉及到跨域问题了,具体什么是跨域请自行百度。
4、解决跨域问题大概有两种办法,本人使用的是通过配置代理来解决的,具体参考http://blog.csdn.net/a1002308667/article/details/52044290,笔者第一次遇到跨域问题,因为教程不够详细所以按照该教程配置时总是失败,好在最后成功了,所以这里再补充一部分细节供新手参考以少走一些弯路。
5、首先proxy.config配置文件的服务地址一定是要改的,改成自己的地图服务地址,将ip与端口号改成自己的(图5),这一步非常重要,若地址错误,后面是不会成功的,楼主深受其害,接着将整个DotNet文件夹拷贝到C:\inetpub\wwwroot下,然后打开IIS管理器,右击DotNet,选择转换为应用程序。转换时记得连接并且测试成功才可以,设置凭据时最好使用电脑管理员账号密码登录(图6)
(图5)
(图6)
6、
6、如果下载的是1.0以上版本则支持ping测试,访问:http:// localhost/DotNet/proxy.ashx?ping时,会看到:
{ "ProxyVersion":"1.1.0", "Configuration File":"OK", "LogFile": "OK"},然后再访问:http://192.16.16.146:8010/DotNet/proxy.ashx?http://192.16.16.146:8010/ArcGISServer/rest/services/?f=pjson,如果看到指定ArcgisServer目录下的json数据,如 {"currentVersion":10.21,"folders":["Utilities","XKMSLFH"],"services":[{"name":"DOM2013","type":"ImageServer"}]},则到目前为止,代理配置成功!若是1.0以下版本,则不支持ping测试,直接访问:http://192.16.16.146:8010/DotNet/proxy.ashx?http://192.16.16.146:8010/ArcGISServer/rest/services/?f=pjson如果看到指定ArcgisServer目录下的json数据如 {"currentVersion":10.21,"folders":["Utilities","XKMSLFH"],"services"[{"name":"DOM2013","type":"ImageServer"}]}(图7),则代理配置成功!
(图7)
7、
最后在代码里加入下面两行即可(图8):
esri.config.defaults.io.proxyUrl="http:// localhost/DotNet/proxy.ashx ";
esri.config.defaults.io.alwaysUseProxy=false;