SOE介绍以及开发部署
更新时间:2024-01-07 02:24:01 阅读量: 教育文库 文档下载
- soe咖啡是什么意思推荐度:
- 相关推荐
产品应用与技术推广部
ArcGIS 10.1 for Server SOE介绍及开发
Esri中国信息技术有限公司
2012年6月
产品应用与技术推广部
《版权声明》
本文档版权为Esri中国信息技术有限公司所有。未经本公司书面许可,任何单位和个人不得以任何形式摘抄、复制本文档的部分或全部,并以任何形式传播。
——制定及修订记录——
版本 V0.1 V0.2 完成日期 2012-6-4 2012-6-11 编写/修订纪要 编写者 刘宇 刘宇 备 注
产品应用与技术推广部
目 录
SOE介绍及开发 ................................................................................................................................ 1 第一章 第二章 1.1
SOE由来 ...................................................................................................................... 1 SOE使用 ...................................................................................................................... 3 必选接口 ................................................................................................................................. 3
IRESTRequestHandler 接口 ......................................................................................... 3 IServerObjectExtension ................................................................................................ 4
1.1.1 1.1.2 1.2
可选接口 ................................................................................................................................. 5
IObjectConstruct ........................................................................................................... 5 IObjectActivate ............................................................................................................. 5
1.2.1 1.2.2 1.3 1.4 1.5
创建SOE .................................................................................................................................. 6 部署SOE ................................................................................................................................ 11 使用SOE ................................................................................................................................ 18
I
产品应用与技术推广部
II
产品应用与技术推广部
第一章 SOE由来
在ArcGIS 10.1中ArcGIS Server不在支持DCOM方式的连接,这也就意味着我们不能通过本地方式的连接使用ArcObjects提供的更多功能,所以我们推荐一种新的方式来实现这些功能,这种方式就是SOE
服务器对象扩展,一个SOE(Server Object Extension)就是一个包含一组方法的类,这个类可以在SOC(ArcGIS 10.1 for Server进程,全称是ArcSOC.exe)中运行,并且可以被web应用程序调用。
Server Objects是粗粒度的AO组件,是一个可以执行特定操作的高级对象,它隐藏了细粒度的ArcObject。Server Objects的粗粒度接口支持对于像绘制地图或地理编码等整体性任务。Server objects也有SOAP接口,可以把server objects暴露成Web Service,从而可以被客户端使用。
SOE是开发者的一个高级选项,使您能够将ArcGIS Server服务基本功能进行
扩展。SOE具有两大优势:
1.SOE可以作为SOAP或REST Web服务,使得用ArcGIS Web APIs建立的客户(用于JavaScript、Flex、Silverlight、iOS等)以便调用这些应用程序。事实上,您的SOE将出现在ArcGIS Services Directory之内,并将提供特性设置、基本类型等ArcGIS APIs能够理解的典型对象类型。
2.SOE能够对ArcObjects进行有效封装,提供理想环境以快速执行您的指令。 .
1
产品应用与技术推广部
可以建立一个SOE,使用动态分段获取里程标志位置,或者实现几何网络分析(在ArcGIS 10的时候,因为工具箱中没有提供几何网络的GP,因此要实现几何网络的分析,可以通过这种办法)
SOE开发需要ArcObjects、.NET或Java以及REST与SOAP等Web服务通信技术的知识。ArcObjects SDK具有多种可供您进行校验的样本,即可用于Java也可用于.NET。
在SOE的开发过程中,我们必须清楚,我们需要在SOE中将请求获取,然后将传入的参数转化为AO,然后通过AO处理,再将处理的结果转成json格式,传给客户端,客户端得到json格式的结果,然后解析。 下图描述了请求响应的整个过程,如下图:
下图描述了请求回复的整个过程,如下图:
2
产品应用与技术推广部
第二章 SOE使用
2.1 必选接口
2.1.1 IRESTRequestHandler 接口 该接口主要有下面两个方法: string GetSchema(); byte[] HandleRESTRequest()
2.1.1.1 IRESTRequestHandler.handleRESTREquest() 方法主要有下面
两个作用:
? 回调资源和操作的方法 ? 获取资源在实例级别的描述
3
产品应用与技术推广部
该方法在识别这两个作用的时候是通过operationName参数,如果该参数是空字符产那就是第二个作用,否则是第一个作用。 该方法的参数如下:
1. String capabilities:一组被资源授权的操作,可以为空字符串
2. String resourceName: 资源名称. 空字符串表示根级别,子资源会通过
‘/’ 表示
3. String operationName: 操作名称
4. String operationInput: 操作的参数,JSON格式
5. String outputFormat:客户端请求的输出格式,如JSON,AMF 6. String[] responseProperties: 通过操作返回的一组键值对,逗号分开
2.1.1.2 IRESTRequestHandler.getSchema() 方法
以JSON格式返回SOE的资源列表
2.1.2 IServerObjectExtension
该接口主要有个方法:Init(IServerObjectHelper pSOH)和void Shutdown();
当Server启动的时候会调用该方法,并将IServerObjectHelper对象传入,该接口是对Server对象的弱引用,可以通过IServerObjectHelper.ServerObject得到服务器对象。
Shutdown方法用在服务器关闭时调用,经常我们在该方法中释放SOE中使用的资源。
4
产品应用与技术推广部
2.2 可选接口
2.2.1 IObjectConstruct
该接口只有一个方法Construct,该方法在Init方法执行后,立即被执行,如果我们的SOE有配置属性,就可通过该方法的参数得到,该方法只调用1次,我们可以将SOE中用的的比较耗费资源的逻辑写在该方法中,比如:获取地图代码,或者你始终操作某一个图层,就可以把获取该图层的代码写在这里。
2.2.2 IObjectActivate
当init和Construct调用后,SOE的对象已经被创建,并且相应的配置信息也得到了,如果SOE的整个逻辑中需要不停的获取和释放服务器上下文,那么就必须实现改接口,改接口有两个方法: activate()和deactivate(),当客户端调用CreateServerContext()
的时候activate()方法被调用,当客户端释放服务器上下文对象时deactivate()方法被调用。
SOE的执行过程
在对接口介绍的时候,我们已经提到了SOE的的运行过程,我们通过下面的图可进一步了解:
5
产品应用与技术推广部
2.3 创建SOE
现在我们创建一个完整的SOE,在VS2010中新建一个项目,选择Server Object Extention,并在右边选择REST 模板,如下图:
当点了确定之后,我们可以看到VS已经为我们生成了一个RestSOETest的类,该类已经实现了了我们前面介绍过的接口,如下:
public class RestSOETest : IServerObjectExtension, IObjectConstruct, IRESTRequestHandler
6
产品应用与技术推广部
{
private string soe_name;
private IPropertySet configProps;
private IServerObjectHelper serverObjectHelper; private ServerLogger logger;
private IRESTRequestHandler reqHandler;
public RestSOETest() {
soe_name = this.GetType().Name; logger = new ServerLogger();
reqHandler = new SoeRestImpl(soe_name, CreateRestSchema()) as IRESTRequestHandler; }
#region IServerObjectExtension Members
public void Init(IServerObjectHelper pSOH) {
serverObjectHelper = pSOH; }
public void Shutdown() { }
#endregion
#region IObjectConstruct Members
public void Construct(IPropertySet props) {
configProps = props; }
#endregion
#region IRESTRequestHandler Members
public string GetSchema() {
return reqHandler.GetSchema(); }
7
产品应用与技术推广部
public byte[] HandleRESTRequest(string Capabilities, string resourceName, string operationName, string operationInput, string outputFormat, string requestProperties, out string responseProperties) {
return reqHandler.HandleRESTRequest(Capabilities, resourceName,
operationName, operationInput, outputFormat, requestProperties, out responseProperties); }
在构造函数中多了一个ServerLogger的对象,通过名称我们就可知道,该对象是一个日志记录对象,用该对象可以对我们的SOE进行信息记录,记录后的信息,最后可以通过Manager的日志查看。在构造函数中还调用了CreateRestSchema函数,如下:
private RestResource CreateRestSchema() {
RestResource rootRes = new RestResource(soe_name, false, RootResHandler);
RestOperation sampleOper = new RestOperation(\,
new string[] { \, \ }, new string[] { \ }, SampleOperHandler);
rootRes.operations.Add(sampleOper);
return rootRes; }
在该函数中创建了Rest资源和Rest资源的操作,并且资源和Rest操作都对应一个处理函数,我们一般称作Resthandler,这里的资源和操作可能比较抽象,我们举一个例子,比如说MapService就是一个资源,而查询就是一个操作,当我们执行操作的时候,处理整个逻辑的就是Resthandler,如上图的RootResHandler和SampleOperHandler分别是处理资源和资源操作的方法,
8
产品应用与技术推广部
这些handler的具体实现如下:
private byte[] RootResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties) {
responseProperties = null;
JsonObject result = new JsonObject(); result.AddString(\, \);
return Encoding.UTF8.GetBytes(result.ToJson()); }
private byte[] SampleOperHandler(NameValueCollection boundVariables, JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties) {
responseProperties = null;
string parm1Value;
bool found = operationInput.TryGetString(\, out parm1Value); if (!found || string.IsNullOrEmpty(parm1Value)) throw new ArgumentNullException(\);
string parm2Value;
found = operationInput.TryGetString(\, out parm2Value); if (!found || string.IsNullOrEmpty(parm2Value)) throw new ArgumentNullException(\);
JsonObject result = new JsonObject(); result.AddString(\, parm1Value); result.AddString(\, parm2Value);
return Encoding.UTF8.GetBytes(result.ToJson()); }
在这里我们要注意RestOperation类,该类对应了我们SOE的一个操作,该类的参数如下:
RestOperation (string name, string[] parameters, string[]
9
产品应用与技术推广部
supportedFormats, OperationHandler handler),这些参数分别对应了操作的名称,参数,支持的格式,以及该操作的处理函数。
一个资源可以有子资源,并且一个资源可以对应多个操作,对于资源的handler我们可以不用关注,但是操作的handler是我们整个SOE的核心部分。 下面是我们自定义的一个操作,其中pLineOperHandler是对应我们的handler
定义的操作:
RestOperation pLineOper = new RestOperation(\,
new string[] { \, \, \, \ },
new string[] { \ }, pLineOperHandler);
当定义好了RestOperation之后,并且成功部署,那么可以在服务目录中看到下面的页面:
10
产品应用与技术推广部
我们可以看出,RestOperation类中的参数和这个对应,当我们点了GET或者POST操作之后,这个时候就执行PlineOperHandler操作,该函数的定义如下:
private byte[] pLineOperHandler(NameValueCollection boundVariables, JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties) {
responseProperties = \;
if (serverObjectHelper.ServerObject is IMapServer) {
mapServer = (IMapServer3)serverObjectHelper.ServerObject; }
// IMapServerObjects pMSO = serverObjectHelper.ServerObject as IMapServerObjects;
IMapServerDataAccess pMapServerDataAcc = null;
IFeatureClass pFeatureClass = null;
11
产品应用与技术推广部
if (serverObjectHelper.ServerObject is IMapServerDataAccess) {
pMapServerDataAcc = serverObjectHelper.ServerObject as IMapServerDataAccess;
pFeatureClass = pMapServerDataAcc.GetDataSource(mapServer.DefaultMapName, 0) as IFeatureClass;
}
// // IMapServer.DefaultMapName
//// IMap map = pMSO.get_Map(mapServer.DefaultMapName);
// //返回参与线性参考
// // routeFeatureLayer = (IFeatureLayer)map.get_Layer(0);
// //线性参考代码
// IFeatureLayer featureLayer = routeFeatureLayer;
string _pPKName;
operationInput.TryGetString(\, out _pPKName);
if (_pPKName==null)
throw new ArgumentNullException(\);
long? _pID;
operationInput.TryGetAsLong(\, out _pID);
if (_pID == null)
throw new ArgumentNullException(\);
double ? _pFrom;
operationInput.TryGetAsDouble(\, out _pFrom);
if (_pFrom == null)
throw new ArgumentNullException(\);
double? _pTo;
operationInput.TryGetAsDouble(\, out _pTo);
12
产品应用与技术推广部
if (_pTo == null)
throw new ArgumentNullException(\);
IPolyline pointColl = FindRoutByMeasure(pFeatureClass, _pPKName.Substring(1, _pPKName.Length - 2), _pID.Value, _pFrom.Value, _pTo.Value);
JsonObject featureJson = new JsonObject();
featureJson.AddJsonObject(\, Conversion.ToJsonObject(pointColl as IGeometry));
return Encoding.UTF8.GetBytes( featureJson.ToJson()); }
在前面已经介绍过,SOE里面的很大一部分代码是和AO对象打交道,而这部分也是我们的核心功能,当我们使用Esri提供给的SOE模板之后,我们要核心要做的就是写SOE请求函数,在这个请求函数也就是handler中,我们的核心AO代码就在这里,我这个函数的核心代码如下:
IPolyline FindRoutByMeasure(IFeatureClass _pRouteFC, string _pPKName, object _pID, double _pFrom, double _pTo) {
IDataset pDataset = (IDataset)_pRouteFC; IName pName = pDataset.FullName;
IRouteLocatorName pRouteLocatorName = new RouteMeasureLocatorNameClass(); pRouteLocatorName.RouteFeatureClassName = pName; pRouteLocatorName.RouteIDFieldName = _pPKName;
pRouteLocatorName.RouteMeasureUnit = esriUnits.esriFeet; pName = (IName)pRouteLocatorName;
IRouteLocator2 pRouteLocator = (IRouteLocator2)pName.Open();
IRouteLocation pRouteLoc = new RouteMeasureLineLocationClass();
pRouteLoc.MeasureUnit = esriUnits.esriFeet; pRouteLoc.RouteID = _pID;
IRouteMeasureLineLocation rMLineLoc = (IRouteMeasureLineLocation)pRouteLoc;
13
产品应用与技术推广部
rMLineLoc.FromMeasure = _pFrom; rMLineLoc.ToMeasure = _pTo;
IGeometry pGeo = null;
esriLocatingError locError;
pRouteLocator.Locate(pRouteLoc, out pGeo, out locError);
return pGeo as IPolyline;
}
其实如果在ArcGIS Engine中做过和线性参考相关的工作,那么这端代码是完全可以在ArcGIS Engine中使用的,所以说SOE的开发并不是想象中的困难,相反如果有了AO基础的话,的确是很简单。
注意:
在这里我将自己遇到的问题说一下,如果在ArcGIS 10或者之前的版本中使用过SOE,那么发现下面的代码是可以运行的,而且没有问题: IMapServer mapServer =
(IMapServer3)serverObjectHelper.ServerObject;
IMapServerObjects3 pMSO = mapServer as IMapServerObjects3;
IMap map = pMSO.get_Map(mapServer.DefaultMapName); 但是在10.1的时候,这句代码是不会成功的,错误的地方在
IMapServerObjects3,这是因为10.1中发布的服务是使用MSD文档,而IMapServerObjects3是针对MXD文档的,因此在10.1中应避免,避免IMap,Ilayer等,那么如何访问要素类,栅格对象,表等对象呢?使用
14
产品应用与技术推广部
IMapServerDataAccess接口,该接口主要有两个方法,如下图:
第一个方法主要获取表,要素类,栅格数据,但是在地图文档中我们有的数据是和其他数据有关联的的比如join操作,那么通过第二个方法我们不但可以获取源表的数据,还可以获取目的表的数据。
2.4 部署SOE
当SOE写完之后,我们通过ArcGIS Manager 进行部署,在Manager中找到站点,然后找到扩展,选择添加扩展,如下图:
找到我们编译后的SOE文件(.soe)结尾,如下图:
15
产品应用与技术推广部
部署成功之后会在Manager中看到,如下图:
2.5 调试SOE
SOE的工程实际上是一个类库,对于类库的调试,我们必须要有入口,对于SOE的入口我们知道是ArcGIS Server,如果在10版本以及之前的版本,我们可以写一个控制台程序,然后通过DCOM方式连接,而现在不能使用DCOM方式连接,那么还有没有其他办法?办法肯定是有的,如果写这样的东西不能调试对开发者来说岂不是很痛苦?当启动ArcGIS Server的服务的时候,会在
16
产品应用与技术推广部
Windows的任务管理器中看到ArcSOC.exe这样的进程,这些进程对应的就是ArcGIS Server的服务,我们可以采用附加进程的方式对SOE进行调试,如下,我们找到所有的ArcSOC.exe,将这些附加到进程中:
在我们的SOE工程中添加断点,如下图:
17
产品应用与技术推广部
这样当我们通过Rest的方式访问SOE的时候,就会进行调试,我们便可以跟踪,看哪里出现问题。
下图是这个SOE运行的结果如下图:
2.6 使用SOE
由于这个SOE是Rest方式的,所以我们可以在Flex,Silverlight这样的客户端使用,我们只需要构造这个SOE的rest地址,然后通过WebClient对象调用(这个是
18
产品应用与技术推广部
Silverlight中的,Flex中可能不一样),并获取结果,详细的例子可以参照Esri官网提供的例子:
http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#SOEElevationLatLonJsonObject
因为在上面的这个例子中,我将几何对象转成json格式的,但是在客户端使用的时候没有将json格式转成几何对象的API,有两种解决办法,我们在客户端获取这个json格式的字符串然后解析,自己构造这个几何对象,第二种方式,我们可以借用FeatureSet.FromJson()方法,这就要求我们在SOE中返回的是一个FeatureSet的描述,我们在代码中稍微修改下即可,如下:
private byte[] pLineOperHandler(NameValueCollection boundVariables,
JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties) {
responseProperties = \;
if (serverObjectHelper.ServerObject is IMapServer) {
mapServer = (IMapServer3)serverObjectHelper.ServerObject; }
// IMapServerObjects pMSO = serverObjectHelper.ServerObject as IMapServerObjects;
IMapServerDataAccess pMapServerDataAcc = null;
IFeatureClass pFeatureClass = null;
if (serverObjectHelper.ServerObject is IMapServerDataAccess) {
pMapServerDataAcc = serverObjectHelper.ServerObject as IMapServerDataAccess;
pFeatureClass = pMapServerDataAcc.GetDataSource(mapServer.DefaultMapName, 0) as IFeatureClass;
19
产品应用与技术推广部
}
string _pPKName;
operationInput.TryGetString(\, out _pPKName);
if (_pPKName==null)
throw new ArgumentNullException(\);
long? _pID;
operationInput.TryGetAsLong(\, out _pID);
if (_pID == null)
throw new ArgumentNullException(\);
double ? _pFrom;
operationInput.TryGetAsDouble(\, out _pFrom);
if (_pFrom == null)
throw new ArgumentNullException(\);
double? _pTo;
operationInput.TryGetAsDouble(\, out _pTo);
if (_pTo == null)
throw new ArgumentNullException(\);
IPolyline pointColl = FindRoutByMeasure(pFeatureClass, _pPKName.Substring(1, _pPKName.Length - 2), _pID.Value, _pFrom.Value, _pTo.Value);
JsonObject featureJson = new JsonObject();
//构造FeatureSet
JsonObject pRest = new JsonObject();
pRest.AddString(\,\);
pRest.AddString(\, \);
JsonObject pSpatial = new JsonObject();
//空间参考
20
产品应用与技术推广部
pSpatial.AddString(\ ,pointColl.SpatialReference.FactoryCode.ToString()); pRest.AddJsonObject(\, pSpatial);
//属性
JsonObject pAtt = new JsonObject();
pAtt.AddString(\, \);
//要素
featureJson.AddJsonObject(\, pAtt);
featureJson.AddJsonObject(\, Conversion.ToJsonObject(pointColl as IGeometry));
//要素集合
JsonObject[] pFea = new JsonObject[1];
pFea[0] = featureJson;
pRest.AddArray(\, pFea);
return Encoding.UTF8.GetBytes(pRest.ToJson()); }
我们建立一个Silverlight工程,在Silverlight中调用这个SOE,核心代码如下:
string SOEurl =
\eOperation?RouteFieldName="ROUTE1"&RouteID=20000013&Stationfrom=0&Stationto=25&f=pjson\;
WebClient webClient = new WebClient();
FeatureSet pFeature = new FeatureSet();
21
产品应用与技术推广部
webClient.OpenReadCompleted += (s, a) => {
JsonValue jsonResponse = JsonObject.Load(a.Result);
FeatureSet pFeatureSet = FeatureSet.FromJson(jsonResponse.ToString());
if (pFeatureSet.Features != null) {
SimpleLineSymbol symbol = new SimpleLineSymbol(); symbol.Color = new SolidColorBrush(Colors.Red); GraphicsLayer gLayer = new GraphicsLayer(); foreach (Graphic g in pFeatureSet.Features) {
g.Symbol = symbol; gLayer.Graphics.Add(g); }
myMap.Layers.Add(gLayer); }
};
webClient.OpenReadAsync(new Uri(SOEurl)); }
运行结果如下图(红色部分为SOE返回的结果):
22
产品应用与技术推广部
第三章 SOE 在Java下的开发
ArcGIS 不仅仅支持在.NET下的开发(因为我习惯NET,所以上面的例子是用C#开发的),对于Java也是支持的,最近在帮同事升级一个用Java写的SOE,借此机会研究了下在Java下如何开发SOE.
Esri同样为Java开发者提供了SOE的开发模板,开发者利用这些模板会很快的创建一个SOE的雏形。
23
产品应用与技术推广部
3.1 新建SOE模板工程
在eclipse新建项目,找到Server Object Extention(在这里省略了如何安装Java版本的SDK和如何在eclipse中配置ArcGIS的模板,这些不是这篇关注的内容,还不太熟悉的人员,可以查阅相关资料,或者在博客:http://blog.csdn.net/arcgis_all上进行提问)
24
产品应用与技术推广部
3.2 填写SOE的名称,显示名称以及描述等信息
3.3 选择SOE的类型
选择SOE类型(REST或者SOAP,我选择的是REST),并填设置操作资源和操作方法:
25
产品应用与技术推广部
3.4 设置SOE配置参数
在NET开发SOE的时候,没有对这个SOE配置参数做介绍,因为在我遇到的SOE开发中,很少用到这个,那么在这里就介绍下。
SOE在init方法调用之后,会调用可选的construct方法,construct方法中有会传入IPropertySet这个对象,该对象是一个Key-Value的集合,该参数就是在我们发布服务,并且配置SOE的时候,在Service Editor页面或者Manager页面上出现的一个配置参数,这些参数可以作为SOE的预配置参数,比如自定义一个查询的SOE,那么在发布服务的时候可以给这个SOE指定对那个图层做查询,这些参数和值是Server自动传入的,要获取相应的值,就需要
26
产品应用与技术推广部
在construct方法中获取。
可以通过下面的代码获取mytest的值:
public void construct(IPropertySet propertySet)throws IOException{
this.name =
(String)propertySet.getProperty(\); }
27
产品应用与技术推广部
3.5 重要方法介绍
Java中处理请求的方法是handleRESTRequest,但是真正调用处理请求的确是 invokeRESTOperation这个方法(这个方法SOE自动生成),当SOE请求进来之后,handleRESTRequest对请求进行判断,如果请求中包含操作的方法,那么handleRESTRequest将请求转交给invokeRESTOperation,由该方法统一分发请求如果是,该方法会对SOE的具体方法进行判断,然后在该方法中获取相应的SOE方法的处理结果,如下:
private byte[] Test(JSONObject operationInput, String outputFormat, JSONObject requestPropertiesJSON, java.util.Map
产品应用与技术推广部
byte[] operationOutput = null;
if(resourceName.equalsIgnoreCase(\|| resourceName.length() == 0)
{
if(operationName.equalsIgnoreCase(\{
operationOutput = Test(operationInputAsJSON, outputFormat, requestPropertiesJSON, responsePropertiesMap);
} } else {
return ServerUtilities.sendError(0, \sub-resource by name \+ resourceName + \
}
return operationOutput; }
public byte[] handleRESTRequest(String capabilities, String
29
产品应用与技术推广部
resourceName, String operationName,
String operationInput, String outputFormat, String
requestProperties, String[] responseProperties)
{
JSONObject
requestPropertiesJSON
=
new
throws IOException, AutomationException
JSONObject(requestProperties);
java.util.Map
HashMap
try {
byte[] response;
if (operationName.length() == 0) {
response = getResource(capabilities, resourceName,
outputFormat, requestPropertiesJSON,
} else
responsePropertiesMap);
30
产品应用与技术推广部
{
response
=
invokeRESTOperation(capabilities,
resourceName, operationName, operationInput, outputFormat,
requestPropertiesJSON,
responsePropertiesMap);
JSONObject
responsePropertiesJSON
=
new
}
JSONObject(responsePropertiesMap);
responseProperties[0]
=
responsePropertiesJSON.toString();
}
catch (Exception e) {
String message = \occurred while handling return response;
REST request for SOE \+ this.getClass().getName() + \+ e.getMessage();
31
产品应用与技术推广部
this.serverLog.addMessage(1, 500, message); return ServerUtilities.sendError(0, message, null).getBytes(\
} } 3.6 调试
在Java中调试SOE,是通过端口号链接访问的(可以将这种方式认为是NET下的附加进程方式)
部署好SOE后,在Manger页面中进行调试设置,设置端口范围,如下图:
32
产品应用与技术推广部
在Java中进行远程连接设置,如下图:
33
产品应用与技术推广部
3.7 测试
下图是将二维坐标和2.5维坐标进行转换的一个测试,如下:
34
产品应用与技术推广部
3.8 小结
NET和Java各有千秋,这个要看开发者到底属于那种语言的粉丝。通过Java下SOE的开发,发现Esri对Java支持的模板比NET下更加强大,更加灵活,方法的创建,属性的创建都可以通过向导来完成,这对Java用户来说的确带来不少便利,SOE就是让我们专注自己的业务逻辑处理。
35
正在阅读:
SOE介绍以及开发部署01-07
四年级语文暑假作业11-12
圆柱坐标机械手05-14
结构化面试技巧:主题演讲类构造03-14
凯宾斯基介绍10-10
检测师检测员考试考前必须看的判断题文集10-03
大自然的声音作文700字02-04
江苏省煤炭消费量进行预测07-05
煤矿机械设备的安装与技术改进分析10-21
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 部署
- 以及
- 开发
- 介绍
- SOE
- 最新珠宝首饰工艺及鉴定专业毕业自我总结
- 榫槽成型半自动切削机(机械设计)
- 中国计算机学会职业教育专业委员会第十一届年会
- 常见的烃
- 江苏省宿迁市沭阳县2014-2015学年高一英语下学期期中调研测试试题牛津译林版
- 2017年安徽省六安市霍邱县孙岗中学数学中考模拟试卷
- 销售话术
- 安全验收表格 - 图文
- 音乐中的数学
- (2013-11-17提交)教育学(期末作业考核)
- 基坑围护降水及土方开挖专项方案
- 商业模式思考的逻辑
- 钢筋安装工程检验批质量验收记录表()
- 2016年政府收支分类科目(功能分类科目)修订后
- 2012诸暨中学提前招生选拔数学卷
- 师范生幼儿园实习心得与收获
- 机械制造技术基础课程教案
- 硅酸盐材料的考试题 - 图文
- 高考英语一轮复习 阅读理解选练(二)121
- 2020高考化学通用版一轮学案:8.3专题研究 酸碱中和滴定及其拓展应用