ArcGis Server开发Web GIS新手体验(二)

ArcGis Server开发Web GIS新手体验(二)

接(一)

  我们知道,.net adf提供的map组件、toc组件等都是标准的asp.net组件。这些组件在运行时,会生成相应的html代码,将自己展现出来。一般还会通过ViewState来保存状态,并生成_doPostBack(javascript)函数,在必要的时候,通过javascript来调用该函数,将客户端数据返回来服务器端,从而激发服务器的响应。总之,我们通过分析生成的html页面,应该可以大致窥见asp.net组件是怎么运行的。
  好,我们现在按F5运行首页,然后在浏览器中查看网页的源代码,赶快看下一吧:
  
  1、首先会看到ID,MapIdClick,start等javascript函数,这些函数是模板为我们生成的,在default.aspx文件中定义的。ID函数中有两行:
 var iddiv = document.getElementById("MapDiv_Map1");
 if (iddiv!=null) iddiv.onmousedown = MapIdClick;

  可以看到,这几个函数的作用是对地图的Identify(点击查询)作出处理。
  为什么要放在这里呢,为什么单单只有点击查询的javascript要在这里定义呢,其它如放大、缩小、平移为什么不在这里处理?这是因为Toolbar组件对放大、缩小、平移等提供了默认的处理方式,而identify没有,这样可以更方便进行扩展。在后面的代码中有一行<esri:Tool ToolTip="Identify" DefaultImage="Images/identify.gif" ClientToolAction="ID()" Name="Identify"...>,可以看到,这个调用是模板为我们生成的(并且这个调用是可以修改的)。待会我们在进一步分析中可以看到这一点。

  2、再向下,是几个隐藏域,其中包含__VIEWSTATE隐藏域,还有__doPostBack函数,这些是asp.net组件生成的,作用是向服务器提交数据,从而与服务器进行交互。
 
  3、往下我们看到了一些引入js脚本文件的代码:
  <script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/common.js"></script>
  <script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/map_functions.js"></script>
  <script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/overview_functions.js"></script>
  <script language="Javascript" src="/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/toolbar_functions.js"></script>
  可以看到,共引入了四个js脚本文件,这些文件的地址也比较奇怪,不是与当前网站在同一个虚拟目录下,而是在http://localhost//aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript目录下。在c:/inetpub/webroot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/文件夹下可以找到这些文件。原来,为了重用的方便,在安装Arcgis Server时,安装程序就已经建立了一个虚拟目录,用于提供这些共享的资源。在这个文件夹上一级目录中,还可以看到images和treeimages两个子目录,以及treeview.htc文件。
  知道了这些javascript文件的藏身之所,各位可以把这些javascript文件逐个看一遍,可以发现其作用主要是与浏览器进行交互。

 4、再往下,是TOC组件的Html代码,代码片断如下:
  <tvns:treenode Expanded="False" DefaultStyle="color:silver;" ImageUrl="/aspnet_client/esri_arcgis_server_webcontrols/9_1/images/outscale.gif" CheckBox="False">
   道路注记<tvns:treenode Expanded="True" ImageUrl="ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx_Toc1_0_1_0_0&amp;NoCache=true"></tvns:treenode>
  这一段代码有一个特别之处就是ImageUrl="ESRI.Web.Controls.MIMEImage.aspx...",这个ESRI.Web.Controls.MIMEImage.aspx是什么东东,是一个网页吗?在机器里找一下,发现根本就不存在这个网页,那它又是何方神圣,竟然可以作为一个图片的地址?我们先往下看看。

 5、<div id='OverviewMap1backdrop' style = 'position: absolute; left: 16px; top: 400px; 204px; height:124px; 

Z-INDEX:104; border-color:LightSteelBlue; border-3px; border-style:Solid; overflow:hidden;'>
<table cellspacing=0 cellpadding=0 style = '198px; height:118px; overflow:hidden;'><tr><td id=OVCell_OverviewMap1></td></tr></table>
</div>
  是鹰眼导航图的代码。怎么只有一个空的Div层和一个空的表格呢?唉,比较简单,我懒得分析了,同志们自己去找吧~

 6、再往下是Toolbar组件的代码,没什么特别的:
<td nowrap width="29" height ="32" align='Center'
  id="Toolbar1ZoomIn"
  onMouseDown="ToolbarMouseDown( 'Toolbar1', 'ZoomIn', 'Tool', event);"
  onMouseOver="ToolbarMouseOver('Toolbar1', 'ZoomIn');"
  onMouseOut="ToolbarMouseOut( 'Toolbar1', 'ZoomIn');"
  style="background-color:LightSteelBlue;font-family:Arial;font-size:Smaller;font-weight:bold;"
  ><img id="Toolbar1ZoomInImage" alt="Zoom In" src="Images/zoominD.gif"  align="absMiddle"></td>

 7、再下面是生成地图组件的代码:
<script language="JavaScript" id="cs_dynamic_Map1">
Maps[mapCounter] = new MapCreation('Map1',0,mapCounter,0,0,502,378,'MapDiv_Map1','Black',2);
mapURL[mapCounter] = "ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx-Map1&ct=5";
MakeMapDiv(mapCounter, 'Map1','ESRI.Web.Controls.MIMEImage.aspx?ImgID=Default.aspx-Map1&ct=5', 'MapCell_Map1','');
mapCounter++;
MapDragRectangle('Map1','ZoomIn', true);
</script>
  又看到了MIMEImage这个东东!它究竟是什么东东呢?
  如果对asp.net不是很熟悉的话,要破解这个秘密可能确实比较困难。
  在asp.net中,所有的请求,都是通过httpHandler来进行处理的。那httphandler又是什么东东呢?其实只要实现在IHttpHandler接口的类,都可以作为一个HttpHandler。在web.config或machine.config文件中,可以定义哪些请求可以由哪个httphandler来处理。查看一下web.config文件,没有这些声明。那就看一下mapchine.config文件吧,这个文件在WINDOWS\Microsoft.NET\Framework\v1.1.4322目录下,用记事本打开它,查找ESRI.Web.Controls.MIMEImage.aspx,好家伙,果然在这里啊!
  <httpHandlers>
  <add verb="*" path="ESRI.Web.Controls.MIMEImage.aspx" type="ESRI.ArcGIS.Server.WebControls.ImageHandler, ESRI.ArcGIS.Server.WebControls, Version=9.1.0.722, Culture=neutral, PublicKeyToken=8fc3cc631e44ad86"/>
  原来ESRI.Web.Controls.MIMEImage.aspx请求是能过ESRI.ArcGIS.Server.WebControls.ImageHandler来处理的。在Visual Studio中,使用对像浏览器查看一下esri.arcgis.server.webcontrols.dll文件,可以看到ImageHandler类,果然实现了IHttpHandler接口。呵呵,其实很简单嘛,我们也完全可以自己写一个类,来执行自定义的请求。
  
  又写累了,就到这里吧。

  待续

原文地址:https://www.cnblogs.com/watsonyin/p/310900.html