本文将解释REST SOE模板中的部分代码的含义。关于如何打开该模板,请参见如何在Visual Studio中打开REST SOE模板。
我们知道一个SOE就是你服务器上的一个COM类,这一点很重要。所以SOE中有几行和COM相关的代码,这些代码给你的SOE分配了一个唯一的ID,并使它对COM是可见的。你也会看到与SOE相关的一些attributes,可以用来定义SOE的显示名称、属性和能力(有时候在ArcGIS的对话框中称作“允许的操作”)。示例代码如下:
[C#]
[ComVisible(true)][Guid("fbcd47be-14e5-4c65-b49d-7cdb6871f30a")][ClassInterface
(ClassInterfaceType.None)][ServerObjectExtension("MapServer", AllCapabilities =
"", DefaultCapabilities = "", Description = "Insert SOE Description here",
DisplayName = "SimpleRestSoe1", Properties = "", SupportsREST = true,
SupportsSOAP = false)]
[VB.NET]
<ServerObjectExtension("MapServer", AllCapabilities
= "", DefaultCapabilities
= "", _
Description
= "Insert SOE Description here", DisplayName
= "SimpleRestSoe1",
Properties
= "", SupportsREST
= True, SupportsSOAP
= False)>
你无须更改这些代码。当你创建项目的时候,GUID会自动分配。
你会注意到你的SOE类是实现了一些接口,代码如下:
[C#]
public class SimpleRestSoe1: IServerObjectExtension, IObjectConstruct,
IRESTRequestHandler
[VB.NET]
Public Class RestSOE1
Implements IServerObjectExtension, IObjectConstruct, IRESTRequestHandler
如下的接口都是创建REST SOE所必需的,各个接口的功能如下所示:
IServerObjectExtension——该接口包含了Init()和Shutdown()方法,分别用于启动和关闭SOE。你无需关注模板中的这部分代码,除非你要在关闭SOE时销毁一些资源。如果在SOE第一次启动的时候,你需要运行一些逻辑代码,不要把代码写在Init()函数中或者SOE的构造函数中,你应该将代码写在下面的IObjectConstruct.Construct() method中。
IObjectConstruct——该接口仅仅包含了一个方法 Construct(),该方法在你的SOE第一次启用的时候运行。你应该把重要的业务逻辑代码(不需要在每次请求的时候都运行的代码)写在此处。比如,如果你知道你总要处理地图中的某一个图层,那么你可以把获取该图层的代码写在此处。
IRESTRequestHandler——该接口用于处理REST请求和响应。该接口中的方法创建schema并处理请求。
在SOE的构造函数中,你会发现SoeRestImpl 类被实例化了,代码如下所示:
[C#]
reqHandler = new SoeRestImpl(soe_name, CreateRestSchema())as IRESTRequestHandler;
[VB.NET]
Dim restImpl As New SoeRestImpl(c_SOEName, rootResource)
reqHandler = CType(restImpl, IRESTRequestHandler)
SoeRestImpl类用于如下功能:
a.验证SOE的schema
b.验证HandleRESTRequest 调用中的资源名和操作名
c.记录服务调用和响应
d.处理错误
SoeRestImpl类实现了IRESTRequestHandler接口。一般情况下,SOE类包含了一个SoeRestImpl类的实例并保存了对IRESTRequestHandler接口的引用。你可以在模板中看到这部分内容。
模板中剩余的函数用于定义REST SOE可以做什么以及如何处理每一个SOE请求。CreateRestSchema() 方法定义了SOE中可获得的资源和操作。每个资源和操作都有一个相关的处理函数,当请求资源或执行操作的时候,相应的处理函数就会被调用。模板中包含了一个示例资源处理函数RootResHandler()以及一个示例操作处理函数SampleOperHandler()。