SOE-动态分段
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
需求:给定一个路径字段、字段值、里程,返回一个点
作者:严瑞(王知方提供技术指导)
1、打开VS2008,新建REST TEMPLATE工程,命名为LineFerencingSOE
2、生成如下工程,打开LineReferencing.cs,LineReferencingSOE继承了四个类: ServicedComponent:如果SOE要注册成COM组件,必须要继承这个类。
IServerObjectExtension:这个类包含Init()和Shutdown()方法,Init()方法是初始化ServerObject,Shutdown()关闭SOE,一般不需要在这两个方法中再写别的代码。
IObjectConstruct:包含一个Construct()方法,当SOE启动的时候会运行这个方法,在这个方法中主是写在SOE运行后需要执行的代码,而不是每次请求需要执行的。比如:获取地图代码,或者你始终操作某一个图层,就可以把获取该图层的代码写在这里。
IRESTRequestHandler:每次请求服务器执行的代码,也就是说你给Server传参后,执行的代码。它下面的CreateRestSchema()方法是创建资源和操作(举个例子说资源和操作:比如FeatureService就是一个资源,而编辑就是它的一个操作),SampleOperHandler()方法是处理请求。
3、先不传任何参数,返回一个测试字符串。上面说了SampleOperHandler()是处理请求的,我们把返回值写到这个方法中,返回值是“Test linereferencing….”,如下,先注释掉有参数传进的代码。
注:参数是从CreateRestSchema()方法中得到的。
4、将该工程重新生成一下,目的是生成\LineReferencingSOE\bin\Debug的LineReferencingSOE.dll文件。
5、用鼠标选中LineReferencingSOE,右键属性:
设置签名密钥:
保存,并重新生成解决方案。
6、将dll文件注册成COM组件(只有注册到COM组件了,才可以注册到ArcGIS
Server中去),打开Visual Studio2008命令提示行:
命令行当前路径指向LineReferencingSOE.dll所在的路径
执行代码:regasm LineReferencingSOE.dll /codebase
7、下面将dll注册到ArcGIS Server中。需要新建一个工程,编写代码注册。新建工程,如下设置:
引入如下几个包:
代码中引入:
8、在Main()函数中编写代码:连接Server,命名扩展服务名
string extensionName = "LineReferencingSOE";是定义了扩展服务的服务名(发布服务时会在ArcCatalog或Manager中的服务类型列表中看到)
9、如果之前注册过同名的SOE,要进行反注册的话,可以用如下的方法:
在命令行中输入“/unregister”参数,
在代码中判断是否进行反注册,该段代码写到Main函数里面
增加一个ExtensionRegistered方法:
继续在Main函数中增加代码:
所有代码如下:
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 LineReferencginSOERegistration
{
class Program
{
static void Main(string[] args)
{
//连接Server
AGSServerConnection agsServerConnection = new AGSServerConnection();
agsServerConnection.Host = "localhost";
agsServerConnection.Connect();
IServerObjectAdmin2 serverObjectAdmin = (IServerObjectAdmin2)
agsServerConnection.ServerObjectAdmin;
string extensionName = "LineReferencingSOE";//扩展服务的服务名(发布服务时会在ArcCatalog或Manager中的服务类型列表中看到)
//检查命令行参数,是否要进行反注册
if (args.Length == 1 && args[0] == "/unregister")
{
// 检查SOE是否已经注册
if (ExtensionRegistered(serverObjectAdmin, extensionName))
{
// 删除SOE
serverObjectAdmin.DeleteExtensionType("MapServer",
extensionName);
Console.WriteLine(extensionName +
" successfully unregistered"); }
}
else
{
// 如果没有注册,则执行如下代码:
if (!ExtensionRegistered(serverObjectAdmin, extensionName))
{
//定义服务的一些属性信息
IServerObjectExtensionType3 serverObjectExtensionType =
(IServerObjectExtensionType3)
serverObjectAdmin.CreateExtensionType();
//找到需要注册的dll,建立的需要注册的Rest工程中的namespace和class的名称
serverObjectExtensionType.CLSID = "LineReferencingSOE.LineReferencingSOE";
//服务描述
serverObjectExtensionType.Description = "Find a Point base on mileage";
//服务名称
= extensionName;
//服务的显示名称
serverObjectExtensionType.DisplayName = "LineReferencingSOE";
.SetProperty("SupportsREST", "true");
.SetProperty("SupportsMSD", "true");