必需的IServerObjectExtension接口包括如下的方法。这个接口被服务器对象用来管理SOE的生命周期。
不要把初始化的逻辑放在SOE类的构造函数或Init函数中,应该将其放到IObjectConstruct.Construct()方法中,该方法在SOE的生命周期中稍后调用。这确保了你已经完全创建了SOE,并可以用你的初始化逻辑记录任何的错误。
当使用SOE的时候,客户端对Web服务发送HTTP请求,该Web服务会返回响应结果。请求处理接口(request handler interface)有助于完成这个通信过程。
你可以用C#或Java开发SOE,其可以支持REST或SOAP或二者均支持。本节余下的内容描述了如何用.Net构建REST和SOAP的Web服务。
SOAP SOE模板应用程序是由一个类组成的,该类实现了SOAP SOE所必需的所有的接口,包括IServerObjectExtension、IObjectConstruct以及IRequestHandler2。在这个结构中另外一个组件就是一个模板Web服务描述语言(WSDL)文件,你可以通过它将Esri的SOAP类型整合进你自己的SOAP实现。更多SOAP SOE类的实现请参见Developing SOAP server object extensions。
下面的示例代码显示了一个简单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
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.msgType | ArcGIS Server log level |
error | Severe |
warning | Warning |
infoSimple | Info |
infoStandard | Fine |
infoDetailed | Verbose |
debug | Debug |
支持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。