SOE开发概览

关于SOE
一个SOE就是一个组件对象模型(COM),其由.Net或Java实现了IServerObjectExtension 接口和一些其他必须实现的接口。服务实例(也可称作“服务器对象”)创建了SOE并调用了Init方法,通过server object helper参数可以将SOE作为一个服务器对象引用来处理。SOE可以在服务器对象上调用方法。
所有SOE使用的接口(IServerObjectExtension和IObjectConstruct)

必需的IServerObjectExtension接口包括如下的方法。这个接口被服务器对象用来管理SOE的生命周期。


Init—当服务器对象启动的时候调用
Shutdown—通知SOE服务器对象将要关闭。作为相应,SOE释放它对server object helper的引用。
如果你的SOE包括配置属性或者需要初始胡逻辑,那么就需要实现可选的接口IObjectConstruct。这个接口仅包含一个方法Construct,该方法在IServerObjectExtension.Init之后调用。Construct将以属性集的形式返回SOE的配置属性。

不要把初始化的逻辑放在SOE类的构造函数或Init函数中,应该将其放到IObjectConstruct.Construct()方法中,该方法在SOE的生命周期中稍后调用。这确保了你已经完全创建了SOE,并可以用你的初始化逻辑记录任何的错误。


SOE Web服务接口(IRESTRequestHandler和IRequestHandler2)
因为SOE是Web服务,它使用请求处理接口(request handler interface)来完成工作,使用ESRI.ArcGIS.SOESupport.ServerLogger对象进行日志记录。
基于REST的SOE Web服务实现了IRESTRequestHandler接口。
基于SOAP的SOE Web服务实现了IRequestHandler2接口。
有可能创建一个同时实现了IRESTRequestHanler和IRequestHandler2接口的SOE以便能同时支持REST和SOAP两种方式。

当使用SOE的时候,客户端对Web服务发送HTTP请求,该Web服务会返回响应结果。请求处理接口(request handler interface)有助于完成这个通信过程。


将SOE作为Web服务进行开发
当你开发一个SOE的时候,其实你就是在开发一个能够接收请求并能返回结果的Web服务。SOE被ArcGIS Server暴露成Web服务,这种方式与其他原生服务(比如map或geocode服务)被暴露的方式是相同的。SOE在GIS服务器中有效运行,通过调用ArcObjects以实现必要的地理空间分析功能。SOE可以影响ArcGIS Server的管理和安全框架,比如通过使用ArcGIS Server 令牌(token)服务模型来确保获取SOE Web服务的安全性。

你可以用C#或Java开发SOE,其可以支持REST或SOAP或二者均支持。本节余下的内容描述了如何用.Net构建REST和SOAP的Web服务。


REST和SOAP SOE模板
在Visual Studio中,ArcGIS提供了REST和SOAP模板。这些模板为你提供了创建SOE所必需的代码。你用这些模板创建SOE,然后修改已经存在的代码,并加入SOE必须得逻辑。
REST SOE模板应用程序是由一个类组成的,该类实现了REST SOE所必需的所有的接口,包括IServerObjectExtension、IObjectConstruct以及IRESTRequestHandler。更多REST SOE类的实现请参见 Developing REST server object extensions.

SOAP SOE模板应用程序是由一个类组成的,该类实现了SOAP SOE所必需的所有的接口,包括IServerObjectExtension、IObjectConstruct以及IRequestHandler2。在这个结构中另外一个组件就是一个模板Web服务描述语言(WSDL)文件,你可以通过它将Esri的SOAP类型整合进你自己的SOAP实现。更多SOAP SOE类的实现请参见Developing SOAP server object extensions。


一个SOE Web服务基本的实现
ArcGIS Server服务代表了托管在GIS服务器容器进程中的“服务器对象”(server objects)。服务器对象包含了与其相关联的预先打包的功能;因此,地图服务器对象(map server objects)托管了地图数据、产生地图图片、处理查询;地理编码服务器对象(geocode server objects)托管了一个能够将位置转换为地址的定位器,诸如此类。
在自定义的工作流中,通过使用已经存在的服务器对象(server objects)扩展了这种功能。SOEs中一个或多个公共的方法(public method)提供了访问该工作流的权限。
客户端知道如何通过标准的协议使用SOE,比如用WSDL使用SOAP服务,用JSON使用REST服务。客户端通过HTTP协议对ArcGIS Server Web服务实例发送请求。这个Web服务实例包含了SOAP和REST请求处理函数以便将这个请求转接到托管在服务器对象(server object)中的SOE上,服务器对象是放在GIS服务器上的。然后SOE对请求进行反序列化,执行业务逻辑(通常要获取服务器对象)并对返回结果进行序列化。返回结果通过同一个HTTP通道进行发送到客户端,并进行反序列化。
ArcGIS for Server是建立在ArcObjects COM架构上的。基于.Net的SOE类必须可以让ArcGIS Server通过COM可见和访问。这是通过ComVisible和GUID这两个attributes来实现的。ClassInterfaceType.None这个attribute告知类型类库产生工具一个默认的类接口不需要被创建。SOE模板也告诉你如何使用其他的attributes定义能力(capabilities)、属性、描述以及支持的Web服务的架构(SOAP和REST)。

下面的示例代码显示了一个简单SOE的声明:

[C#]

[ComVisible(true)][Guid("b210df6d-83af-4e02-bf34-db72387a8257")][ClassInterface
    (ClassInterfaceType.None)][ServerObjectExtension("MapServer", AllCapabilities = 
    "", DefaultCapabilities = "", Description = "A simple REST SOE", DisplayName = 
    "RestSOE", Properties = "", SupportsREST = true, SupportsSOAP = false)]
public class RestSOE: IServerObjectExtension, IObjectConstruct, IRESTRequestHandler
{

    . . . 

}

[VB.NET]

<ComVisible(True), Guid("2ea26d5b-d1de-4d9e-a1ca-25e3a3cd3d4e"), ClassInterface(ClassInterfaceType.None)> _
            <ServerObjectExtension("MapServer", AllCapabilities
    = "", DefaultCapabilities
    = "", _
      Description
    = "A simple REST SOE", DisplayName
    = "RestSOE", _
      Properties
    = "", SupportsREST
    = True, SupportsSOAP
    = False)>

    Public Class RestSOE
        
        . . .
        
    End Class

SOE 能力(capabilities)
SOE方法可以按照“能力”(capabilities)进行分组。每个capabilities通过一个对应的配置原则进行授权。对SOE的每个调用都包括了capabilities配置信息以及被调用的操作方法。SOE应该检查capabilities以便于判断某个方法是否该执行。比如,假设一个SOE有三个方法:M1、M2、M3和两个capabilities:C1(包含方法M1,M2)和C2(包含M1,M2,M3)。当在一个服务器对象上启用了SOE之后,配置信息仅仅启用了C1的capabilities。这样,就不能调用SOE上的M3方法。
将方法按照capabilities进行分组不是必须的。


ESRI.ArcGIS.SOESupport 库
ArcGIS for Server包括了一个.Net库ESRI.ArcGIS.SOESupport,以便开发者在SOE的开发过程中定义SOAP和REST内容。这个库包含了固定的代码,这些代码用于对消息进行序列化与反序列化、对业务逻辑代码的调用、错误处理以及日志记录。总之,模板代码从实现类(对于REST是SoeRestImpl类,对于SOAP是SoeSoapImpl类)开始,该类用于组织管理SOE的功能,以及对SOE中的方法进行调用。这个库的使用的讨论可分别参见SOAP和REST章节。


日志记录
你可以在SOE中通过SOESupport.ServerLogger类将信息写入到ArcGIS Server日志中。在你的SOE构造函数中,你可以创建这个日志管理器。示例代码如下所示:
[C#]

logger = new ServerLogger();

[VB.NET]

logger = New ServerLogger()

你可以用SOE写入各种等级的信息。如下所示,8000是一个开发者用SOE自定义的日志码。

[C#]

logger.LogMessage(ServerLogger.msgType.infoStandard, "Shutdown", 8000, 
    "Custom message: Shutting down the SOE");

[VB.NET]

logger.LogMessage(ServerLogger.msgType.infoStandard, "Shutdown", 8000, "Custom message: Shutting down the SOE")

消息的等级可以通过ServerLogger.msgType获取,其与ArcGIS Server日志信息的等级对应如下:

ServerLogger.msgTypeArcGIS Server log level
errorSevere
warningWarning
infoSimpleInfo
infoStandardFine
infoDetailedVerbose
debugDebug

支持REST和SOAP接口
如果你想将你的SOE功能通过SOAP和REST的方式暴露出来,你有如下两个选择:
a. 分别用SOAP和REST的模板创建SOEs。尽管这种方式更直接,但是这需要你将两个SOE设置为不同的名字。
b. 在同一个SOE中实现IRestHandler2和IRESTRequestHandler接口。实现这种方法的一个办法是使用SOAP模板,然后把REST模板中IRESTRequestHandler的实现代码拷贝到SOAP模板中,为了减少代码冗余,应该将你的业务逻辑代码封装到一个单独的类中,然后通过REST和SOAP的请求处理函数对其进行调用。


线程
SOE应该能在SOE的主线程中创建和获取ArcObjects。不与ArcObjects进行交互的第三方库应该运行在其他的线程上。只有当他们在同一个线程中创建和销毁的时候,才能在新衍生的线程中使用ArcObjects。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值