SOE开发概览

SOE开发概览

<div class="article-info-box">
    <div class="article-bar-top d-flex">
                                            <span class="time">2013年01月02日 16:19:26</span>
        <div class="float-right">
            <span class="read-count">阅读数:2575</span>
                                        </div>
    </div>
</div>
<article>
    <div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">

关于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#]


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

[VB.NET]


  
  
  1. <ComVisible( True), Guid( "2ea26d5b-d1de-4d9e-a1ca-25e3a3cd3d4e"), ClassInterface(ClassInterfaceType.None)> _
  2. <ServerObjectExtension( "MapServer", AllCapabilities
  3. = "", DefaultCapabilities
  4. = "", _
  5. Description
  6. = "A simple REST SOE", DisplayName
  7. = "RestSOE", _
  8. Properties
  9. = "", SupportsREST
  10. = True, SupportsSOAP
  11. = False)>
  12. Public Class RestSOE
  13. . . .
  14. 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#]


  
  
  1. logger.LogMessage(ServerLogger.msgType.infoStandard, "Shutdown", 8000,
  2. "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。


    <div class="article-bar-bottom">
            <div class="article-copyright">
        版权声明:本文为博主原创文章,未经博主允许不得转载。如果觉得文章不错,记得顶一下!GitHub: https://github.com/iSpring         https://blog.csdn.net/sunqunsunqun/article/details/8459103      </div>
                    <div class="tags-box artic-tag-box">
        <span class="label">文章标签:</span>
                    <a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=rest&amp;t=blog" target="_blank">rest                     </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=Rest&amp;t=blog" target="_blank">Rest                     </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=REST&amp;t=blog" target="_blank">REST                     </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=soap&amp;t=blog" target="_blank">soap                     </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=SOAP&amp;t=blog" target="_blank">SOAP                     </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=Soap&amp;t=blog" target="_blank">Soap                     </a>
    </div>
                    <div class="tags-box">
        <span class="label">个人分类:</span>
                    <a class="tag-link" href="https://blog.csdn.net/sunqunsunqun/article/category/1164471" target="_blank">GIS                      </a>
    </div>
                            <div class="tags-box hot-word">
        <span class="label">相关热词:</span>
                    <a class="tag-link" href="https://blog.csdn.net/su317/article/details/78088990" target="_blank">
        soe         </a>
                    <a class="tag-link" href="https://blog.csdn.net/suwenjiang/article/details/17919075" target="_blank">
        soe调试           </a>
                    <a class="tag-link" href="https://blog.csdn.net/su317/article/details/78088990" target="_blank">
        soe配置文件         </a>
                    <a class="tag-link" href="https://blog.csdn.net/yongfeng596/article/details/40394239" target="_blank">
        堆栈溢出soe         </a>
                    <a class="tag-link" href="https://blog.csdn.net/huyanliang/article/details/47170949" target="_blank">
        soe模型           </a>
                </div>
        </div>

<!-- !empty($pre_next_article[0]) -->
        <div class="related-article related-article-prev text-truncate">
    <a href="https://blog.csdn.net/iispring/article/details/8457662">
        <span>上一篇</span>如何将.Net SOE迁移升级到10.1上       </a>
</div>
            <div class="related-article related-article-next text-truncate">
    <a href="https://blog.csdn.net/iispring/article/details/8479103">
        <span>下一篇</span>REST SOE是什么?        </a>
</div>
</div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值