ArcGIS 服务对象扩展(SOE)新手自学笔记(5):注册与调试
2012-09-02 20:21
295 查看
上一篇到现在过去好几天了,本来打算用ESRI官方自带的例子呢,后来觉得还是应该实践一下。这几天都在忙着写这个例子,其中也出现了好多问题,从一开始思考解决问题的方法,到找代码,再调试成功,费了不少事,好在问题都已经解决了。不喜欢说废话,还是忍不住说了这么多,下面正式进入主题。
首先说说我们要解决的问题。gp服务广泛使用的一个原因是他可以做栅格数据的分析,那好我们就用SOE来解决一个插值问题。在gp服务中,我们可以通过设置输入输出类型来保客户端成功加载分析结果,大部分分析结果是以图片形式传到客户端。在SOE中理论上是可以设置输出图片形式,但帮助中只是简单地说了几句,很不详细,所以我用的方法是将栅格分类后转换成矢量数据,再将矢量数据序列化成json格式,传给客户端。流图如下:
获取要素类---》插值---》重分类---》栅格转面---》序列化成json---》客户端
1.编写代码
新建一个工程,命名为Saturation
首先加入以下引用:
View Code
在代码中有个地方需要注意:
serverObjectExtensionType.CLSID = "Saturation.Saturation";
CLSID的值必须与你的命名空间的类名相一致
2.注册
(1)注册COM组件
SOE其实是运行在服务器端的COM组件,并且你需要在每台运行SOC的机器上都为其注册COM组件
* 右击Saturation工程--》属性--》生成,将目标平台选为“x86”,因为ArcServer是运行在32位机器上
*在属性中选择“签名”选项卡,为程序集生成一个签名
*在开始菜单-》visual studio 20110-》visual studio tools-》命令提示,打开命令提示工具
*在命令提示工具中输入命令:regasm <path to DLL> /codebase,在本例中输入如下命令:
regasm “C:\Users\LZZ\Documents\Visual Studio 2010\Projects\Saturation\Saturation\bin\Debug\Saturation.dll” /codebase
(2)ArcServer服务器注册
现在程序集已经注册号,接下来要在ArcServer服务器上注册,这里要用到RegisterSaturation工程,右击工程-》属性-》调试-》启动新实例,如果注册成功,你会看到一个提示成功的信息。
注意:在注册的时候一定要保证让运行在这台机器上的soc用户能够访问到你上面注册的dll,否则会提示你无法注册(给soc用户能够读取你注册的dll的权限)
3.调试
如果没有调试的话,那岂不是太痛苦了,不过还有说回来,SOE这个东西有调试也很痛苦。他需要附加到SOC进程中去,而你的机器上往往会有多个SOC进程,这时候如果你附加错误的话,你是无法进行调试的,我常用的方法是把其他的服务全部删除,是删除不是停止;这里还会碰到一个古怪的问题,就是第一次你可以调试,当你停止调后,再一次附加到进城后却无法调试,我的方法是停止服务,将该工程重新生成,然后启动服务,在附加到进程中去。这是我的这几天捉摸出来的经验。在调试之前我们首先需要使服务支持SOE,貌似在ArcGIS10中只支持MapServer的SOE。
这里我建议你用Manager来发布服务,发布服务的方法跟发布普通mapServer的方法一样,如果你的SOE在服务器上注册成功的话,你会看到以下内容:
![](http://pic002.cnblogs.com/images/2012/412020/2012090219535433.jpg)
在这里你不需要选中,我碰到过注册成功后这在里面却不显示的问题,这时候你只要重启一下计算机即可。发布服务成功后,点击编辑服务:
![](http://pic002.cnblogs.com/images/2012/412020/2012090219593015.jpg)
在这里选中Saturation REST,在下方选中两个check框,点击右边按钮保存并重启,现在我们的mapServer已经有了SOE能力。接下来我们进行调试:
在VS中点击调试-》附加到进程:
![](http://pic002.cnblogs.com/images/2012/412020/2012090220064244.jpg)
如果你看到你附加到进城后,断点依然显示的话,说明可以正常调试,否则你就需要看一下前文提到的解决方法啦。
![](http://pic002.cnblogs.com/images/2012/412020/2012090220092583.jpg)
当点击按钮时,后进入VS中的断点处:
![](http://pic002.cnblogs.com/images/2012/412020/2012090220110229.jpg)
运行成功后,你会看到返回的结果为json类型对象
![](http://pic002.cnblogs.com/images/2012/412020/2012090220123069.jpg)
现在我们已经介绍完SOE的内容了,如果你还有什么不了解的可以直接看帮助:
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Extending_ArcGIS_Server/0001000000mv000000/
这里补充几句:官网中有三个例子,其中空间查询的那个我没运行成功,是跟里面设置属性也有关,因为我没用过里面的WebControl对他不太了解,而且我们的东西不需要使用属性页,所以暂时还无法解决他。希望有哪位大神看了这篇文章后能给小人指点一下,感激不尽。
这个教程到这里就暂时告一段落了,如果以后还碰到关于这种技术的问题话,我会继续发博文的。
在这里顺便感谢一下群哥多年来的帮助,这个技术也是从他那听说的。可以说没有群哥,也就没有这系列教程。呵呵,祝大家好运!!!
首先说说我们要解决的问题。gp服务广泛使用的一个原因是他可以做栅格数据的分析,那好我们就用SOE来解决一个插值问题。在gp服务中,我们可以通过设置输入输出类型来保客户端成功加载分析结果,大部分分析结果是以图片形式传到客户端。在SOE中理论上是可以设置输出图片形式,但帮助中只是简单地说了几句,很不详细,所以我用的方法是将栅格分类后转换成矢量数据,再将矢量数据序列化成json格式,传给客户端。流图如下:
获取要素类---》插值---》重分类---》栅格转面---》序列化成json---》客户端
1.编写代码
新建一个工程,命名为Saturation
首先加入以下引用:
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Server; using ESRI.ArcGIS; using ESRI.ArcGIS.ADF.Connection.AGS; namespace RegisterSaturation { class Program { static void Main(string[] args) { // Must run as an user in the agsadmin group on the SOM ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsServerConnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection(); agsServerConnection.Host = "localhost"; agsServerConnection.Connect(); ESRI.ArcGIS.Server.IServerObjectAdmin2 serverObjectAdmin = agsServerConnection.ServerObjectAdmin as ESRI.ArcGIS.Server.IServerObjectAdmin2; // This name must match those defined for property pages string extensionName = "Saturation"; // Check command line arguments to see if SOE is to be unregistered if (args.Length == 1 && args[0] == "/unregister") { // Check whether the SOE is registered if (ExtensionRegistered(serverObjectAdmin, extensionName)) { // Delete the SOE serverObjectAdmin.DeleteExtensionType("MapServer", extensionName); Console.WriteLine(extensionName + " successfully unregistered"); } else Console.WriteLine(extensionName + " is not registered with ArcGIS Server"); } else { // Check whether the SOE is registered if (!ExtensionRegistered(serverObjectAdmin, extensionName)) { // Use IServerObjectExtensionType3 to get access to info properties ESRI.ArcGIS.Server.IServerObjectExtensionType3 serverObjectExtensionType = serverObjectAdmin.CreateExtensionType() as ESRI.ArcGIS.Server.IServerObjectExtensionType3; // Must match the namespace and class name of the class implementing IServerObjectExtension serverObjectExtensionType.CLSID = "Saturation.Saturation"; //serverObjectExtensionType.CLSID = "{C41E8674-F186-4a0c-8FC9-AAB7885EFD00}"; serverObjectExtensionType.Description = "the shops saturation"; serverObjectExtensionType.Name = extensionName; // Name that will be shown in the capabilities list on property pages serverObjectExtensionType.DisplayName = "Saturation REST"; // Use info properties to define capabilities and msd support serverObjectExtensionType.Info.SetProperty("DefaultWebCapabilities", "GetInfo"); serverObjectExtensionType.Info.SetProperty("AllWebCapabilities", "GetInfo,Saturation"); serverObjectExtensionType.Info.SetProperty("SupportsMSD", "true"); // Required to enable exposure of SOE with ArcGIS Server REST endpoint serverObjectExtensionType.Info.SetProperty("SupportsREST", "true"); // Register the SOE with the server serverObjectAdmin.AddExtensionType("MapServer", serverObjectExtensionType); Console.WriteLine(extensionName + " successfully registered with ArcGIS Server"); } else Console.WriteLine(extensionName + " is already registered with ArcGIS Server"); } Console.ReadLine(); } // Checks whether an extension with the passed-in name is already registered with the passed-in server static private bool ExtensionRegistered(ESRI.ArcGIS.Server.IServerObjectAdmin2 serverObjectAdmin, string extensionName) { // Get the extensions that extend MapServer server objects ESRI.ArcGIS.Server.IEnumServerObjectExtensionType extensionTypes = serverObjectAdmin.GetExtensionTypes("MapServer"); extensionTypes.Reset(); // If an extension with a name matching that passed-in is found, return true ESRI.ArcGIS.Server.IServerObjectExtensionType extensionType = extensionTypes.Next(); while (extensionType != null) { if (extensionType.Name == extensionName) { //serverObjectAdmin.DeleteExtensionType("MapServer", extensionName); return true; } extensionType = extensionTypes.Next(); } // No matching extension was found, so return false return false; } } }
在代码中有个地方需要注意:
serverObjectExtensionType.CLSID = "Saturation.Saturation";
CLSID的值必须与你的命名空间的类名相一致
2.注册
(1)注册COM组件
SOE其实是运行在服务器端的COM组件,并且你需要在每台运行SOC的机器上都为其注册COM组件
* 右击Saturation工程--》属性--》生成,将目标平台选为“x86”,因为ArcServer是运行在32位机器上
*在属性中选择“签名”选项卡,为程序集生成一个签名
*在开始菜单-》visual studio 20110-》visual studio tools-》命令提示,打开命令提示工具
*在命令提示工具中输入命令:regasm <path to DLL> /codebase,在本例中输入如下命令:
regasm “C:\Users\LZZ\Documents\Visual Studio 2010\Projects\Saturation\Saturation\bin\Debug\Saturation.dll” /codebase
(2)ArcServer服务器注册
现在程序集已经注册号,接下来要在ArcServer服务器上注册,这里要用到RegisterSaturation工程,右击工程-》属性-》调试-》启动新实例,如果注册成功,你会看到一个提示成功的信息。
注意:在注册的时候一定要保证让运行在这台机器上的soc用户能够访问到你上面注册的dll,否则会提示你无法注册(给soc用户能够读取你注册的dll的权限)
3.调试
如果没有调试的话,那岂不是太痛苦了,不过还有说回来,SOE这个东西有调试也很痛苦。他需要附加到SOC进程中去,而你的机器上往往会有多个SOC进程,这时候如果你附加错误的话,你是无法进行调试的,我常用的方法是把其他的服务全部删除,是删除不是停止;这里还会碰到一个古怪的问题,就是第一次你可以调试,当你停止调后,再一次附加到进城后却无法调试,我的方法是停止服务,将该工程重新生成,然后启动服务,在附加到进程中去。这是我的这几天捉摸出来的经验。在调试之前我们首先需要使服务支持SOE,貌似在ArcGIS10中只支持MapServer的SOE。
这里我建议你用Manager来发布服务,发布服务的方法跟发布普通mapServer的方法一样,如果你的SOE在服务器上注册成功的话,你会看到以下内容:
![](http://pic002.cnblogs.com/images/2012/412020/2012090219535433.jpg)
在这里你不需要选中,我碰到过注册成功后这在里面却不显示的问题,这时候你只要重启一下计算机即可。发布服务成功后,点击编辑服务:
![](http://pic002.cnblogs.com/images/2012/412020/2012090219593015.jpg)
在这里选中Saturation REST,在下方选中两个check框,点击右边按钮保存并重启,现在我们的mapServer已经有了SOE能力。接下来我们进行调试:
在VS中点击调试-》附加到进程:
![](http://pic002.cnblogs.com/images/2012/412020/2012090220064244.jpg)
如果你看到你附加到进城后,断点依然显示的话,说明可以正常调试,否则你就需要看一下前文提到的解决方法啦。
![](http://pic002.cnblogs.com/images/2012/412020/2012090220092583.jpg)
当点击按钮时,后进入VS中的断点处:
![](http://pic002.cnblogs.com/images/2012/412020/2012090220110229.jpg)
运行成功后,你会看到返回的结果为json类型对象
![](http://pic002.cnblogs.com/images/2012/412020/2012090220123069.jpg)
现在我们已经介绍完SOE的内容了,如果你还有什么不了解的可以直接看帮助:
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Extending_ArcGIS_Server/0001000000mv000000/
这里补充几句:官网中有三个例子,其中空间查询的那个我没运行成功,是跟里面设置属性也有关,因为我没用过里面的WebControl对他不太了解,而且我们的东西不需要使用属性页,所以暂时还无法解决他。希望有哪位大神看了这篇文章后能给小人指点一下,感激不尽。
这个教程到这里就暂时告一段落了,如果以后还碰到关于这种技术的问题话,我会继续发博文的。
在这里顺便感谢一下群哥多年来的帮助,这个技术也是从他那听说的。可以说没有群哥,也就没有这系列教程。呵呵,祝大家好运!!!
相关文章推荐
- ArcGIS 服务对象扩展(SOE)新手自学笔记(1):初识SOE
- ArcGIS 服务对象扩展(SOE)新手自学笔记(3):REST SOE模板下
- ArcGIS 服务对象扩展(SOE)新手自学笔记(2):REST SOE模板上
- ArcGIS 服务对象扩展(SOE)新手自学笔记(4):Schema、Resource、Operation
- [原]Java程序员的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
- win7注册进程外组件, 服务, 以及COM组件调试
- python自学笔记(4)--Python文件对象、os模块及pickle
- Linux自学笔记——日志服务之rsyslog
- 自学Java系列 笔记5 Java学习之匿名对象
- [iphone 开发学习笔记]Object-C和C语言最大的区别也是最大的扩展-----消息(即如何调用一个对象中的函数)
- C++ 学习笔记(6)函数、局部静态对象、重载函数、内联函数、constexpr函数、调试帮助、函数匹配、函数指针
- Thinking in Java 自学笔记——第二章 一切皆对象
- java新手笔记24 Math/String对象
- 【自学笔记】 JavaScript 字符串对象 添加样式
- AngularJS笔记---注册服务
- Java程序员的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
- 嗡汤圆的Spring Cloud自学(PART.2):eureka服务注册与代理端使用
- java调用arcgis soe发布的rest服务,中文传值乱码问题
- ArcGIS API For Flex对ImageServer发布的服务进行渲染及RasterFunction支持函数(学习笔记)
- 整理SCJP的听课笔记。(辛苦整理出来,希望对象我一样的新手有帮助)