您的位置:首页 > 其它

ArcGIS 服务对象扩展(SOE)新手自学笔记(5):注册与调试

2012-09-02 20:21 295 查看
  上一篇到现在过去好几天了,本来打算用ESRI官方自带的例子呢,后来觉得还是应该实践一下。这几天都在忙着写这个例子,其中也出现了好多问题,从一开始思考解决问题的方法,到找代码,再调试成功,费了不少事,好在问题都已经解决了。不喜欢说废话,还是忍不住说了这么多,下面正式进入主题。

  首先说说我们要解决的问题。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在服务器上注册成功的话,你会看到以下内容:



  在这里你不需要选中,我碰到过注册成功后这在里面却不显示的问题,这时候你只要重启一下计算机即可。发布服务成功后,点击编辑服务:



在这里选中Saturation REST,在下方选中两个check框,点击右边按钮保存并重启,现在我们的mapServer已经有了SOE能力。接下来我们进行调试:

在VS中点击调试-》附加到进程:



如果你看到你附加到进城后,断点依然显示的话,说明可以正常调试,否则你就需要看一下前文提到的解决方法啦。



当点击按钮时,后进入VS中的断点处:



运行成功后,你会看到返回的结果为json类型对象



现在我们已经介绍完SOE的内容了,如果你还有什么不了解的可以直接看帮助:

http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Extending_ArcGIS_Server/0001000000mv000000/

  这里补充几句:官网中有三个例子,其中空间查询的那个我没运行成功,是跟里面设置属性也有关,因为我没用过里面的WebControl对他不太了解,而且我们的东西不需要使用属性页,所以暂时还无法解决他。希望有哪位大神看了这篇文章后能给小人指点一下,感激不尽。

  这个教程到这里就暂时告一段落了,如果以后还碰到关于这种技术的问题话,我会继续发博文的。

  在这里顺便感谢一下群哥多年来的帮助,这个技术也是从他那听说的。可以说没有群哥,也就没有这系列教程。呵呵,祝大家好运!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐