一、安装vs和arcgis server for .net(本例是vs2010、as 10),然后打开vs新建一个项目

ArcGis SOE(server object extensions)之REST Template初体验

二、项目创建成功后(本例项目名称是GetArea),打开.cs文件。

ArcGis SOE(server object extensions)之REST Template初体验

三、接口方法说明

 private RestResource CreateRestSchema()
        {
            RestResource rootRes = new RestResource(soe_name, false, RootResHandler);

            RestOperation sampleOper = new RestOperation("getGeometryArea",
                                                      new string[] { "sqlString" },
                                                      new string[] { "json" },
                                                      SampleOperHandler);

            rootRes.operations.Add(sampleOper);

            return rootRes;
        }

CreateRESTSchema函数中定义了在你的SOE中可以获取的Resource和Operation,每一个Resource和Operation都与一个处理函数(handle function)相关联。该处理函数用来在Resource或Operation被触发时,描述所要进行的处理操作。这里面就是你需要编写大量AO代码的地方。
  在REST SOE模板中,有一个处理resource逻辑的RootRESTHandler函数,他返回一个简单的JSON格式的字符串
  一个resource的handler function实际上是一个在SOESupport类库中的代理(delegate),这意味着所有的resource的处理函数都有一个类似的函数签名。  

SOE中接口和方法具体可以参考esri官网:http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/What_is_a_server_object_extension/0001000000zv000000/

四、附上我的项目中的GetArea.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Collections.Specialized;

using System.Runtime.InteropServices;
using System.EnterpriseServices;

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.SOESupport;


//TODO: sign the project (project properties > signing tab > sign the assembly)
//      this is strongly suggested if the dll will be registered using regasm.exe <your>.dll /codebase


namespace GetArea
{
    [ComVisible(true)]
    [Guid("8ea49511-1303-4ddc-aef9-3056741d7478")]
    [ClassInterface(ClassInterfaceType.None)]
    public class GetArea : ServicedComponent, IServerObjectExtension, IObjectConstruct, IRESTRequestHandler
    {
        private string soe_name;

        private IPropertySet configProps;
        private IServerObjectHelper serverObjectHelper;
        private ServerLogger logger;
        private IRESTRequestHandler reqHandler;
    
        public GetArea()
        {
            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();
        }

        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);
        }

        #endregion

        private RestResource CreateRestSchema()
        {
            RestResource rootRes = new RestResource(soe_name, false, RootResHandler);

            RestOperation sampleOper = new RestOperation("getGeometryArea",
                                                      new string[] { "sqlString" },
                                                      new string[] { "json" },
                                                      SampleOperHandler);

            rootRes.operations.Add(sampleOper);

            return rootRes;
        }

        private byte[] RootResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties)
        {
            responseProperties = null;

            JsonObject result = new JsonObject();
            result.AddString("hello", "world");

            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("sqlString", out parm1Value);
            if (!found || string.IsNullOrEmpty(parm1Value))
                throw new ArgumentNullException("sqlString");

            double geometryArea = GetGeometryArea(parm1Value);
            string strArea = geometryArea.ToString();
            JsonObject result = new JsonObject();
            result.AddString("GeometryArea", strArea);
            return Encoding.UTF8.GetBytes(result.ToJson());
        }


        public double GetGeometryArea(string sql)
        {
            IMapServer mapServer = serverObjectHelper.ServerObject as IMapServer;
            IMapServerObjects mapServerObjs = mapServer as IMapServerObjects;
            IMap map = mapServerObjs.get_Map(mapServer.DefaultMapName);
            IFeatureLayer pflayer = map.get_Layer(0) as IFeatureLayer;
            IFeatureClass pfc = pflayer.FeatureClass;

            ISpatialFilter psf = new SpatialFilterClass();
            psf.WhereClause = sql;
            psf.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;

            IFeatureCursor pfCursor = pfc.Search(psf as IQueryFilter, false);
            IFeature pfeature = pfCursor.NextFeature();

            if (pfeature == null)
                return -2;
            IPolygon polygon = pfeature.Shape as IPolygon;

            IArea pArea = polygon as IArea;

            return pArea.Area;
        }
    }
}

五、注册

1、注册com:在开始菜单-》visual studio 20110-》visual studio tools-》命令提示,打开命令提示工具。输入regasm  "文件路径"  /codebase  例如:regasm  “C:\Users\LZZ\Documents\Visual Studio 2010\Projects\Saturation\Saturation\bin\Debug\GetArea.dll”  /codebase

2、注册arcserver:新建一个控制台应该程序,加入以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS;
using ESRI.ArcGIS.ADF.Connection.AGS;

namespace Registersoerest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Must run as an user in the agsadmin group on the SOM.
            ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsServerConnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection();
            agsServerConnection.Host = "localhost";
            agsServerConnection.Connect();
            ESRI.ArcGIS.Server.IServerObjectAdmin2 serverObjectAdmin = agsServerConnection.ServerObjectAdmin as ESRI.ArcGIS.Server.IServerObjectAdmin2;
            // 扩展类名,和程序集同名 
            string extensionName = "GetArea"; // 注销时需要输入参数
            if (args.Length == 1 && args[0] == "/unregister")
            { // 检测是否已经注册SOE 
                if (ExtensionRegistered(serverObjectAdmin, extensionName))
                { // 删除SOE.
                    serverObjectAdmin.DeleteExtensionType("MapServer", extensionName); Console.WriteLine(extensionName + " successfully unregistered");
                }
                else
                    Console.WriteLine(extensionName + " is not registered with ArcGIS Server");
            }
            else
            {
                // 检查SOE是否已经注册. 
                if (!ExtensionRegistered(serverObjectAdmin, extensionName))
                { //获取属性页.
                    ESRI.ArcGIS.Server.IServerObjectExtensionType3 serverObjectExtensionType = serverObjectAdmin.CreateExtensionType() as ESRI.ArcGIS.Server.IServerObjectExtensionType3;
                    // 程序集的CLSID.
                    serverObjectExtensionType.CLSID = "GetArea.GetArea"; //serverObjectExtensionType.CLSID = "{C41E8674-F186-4a0c-8FC9-AAB7885EFD00}"; 
                    serverObjectExtensionType.Description = "Returns KML of a feature at the input location for the input layer";
                    serverObjectExtensionType.Name = extensionName;
                    // 显示的名称. 
                    serverObjectExtensionType.DisplayName = "GetArea";
                    // Required to enable exposure of SOE with ArcGIS Server REST endpoint.
                    serverObjectExtensionType.Info.SetProperty("SupportsREST", "true");
                    serverObjectExtensionType.Info.SetProperty("SupportsMSD", "false");
                    // 注册SOE.到Server
                    serverObjectAdmin.AddExtensionType("MapServer", serverObjectExtensionType); Console.WriteLine(extensionName + " successfully registered with ArcGIS Server");
                }
                else
                    Console.WriteLine(extensionName + " is already registered with ArcGIS Server");
            }
            Console.ReadLine();

        }

        static private bool ExtensionRegistered(ESRI.ArcGIS.Server.IServerObjectAdmin2 serverObjectAdmin, string extensionName)
        { // Get the extensions that extend MapServer server objects. 
            ESRI.ArcGIS.Server.IEnumServerObjectExtensionType extensionTypes = serverObjectAdmin.GetExtensionTypes("MapServer"); extensionTypes.Reset();
            // If an extension with a name matching that passed-in is found, return true.
            ESRI.ArcGIS.Server.IServerObjectExtensionType extensionType = extensionTypes.Next();
            while (extensionType != null)
            {
                if (extensionType.Name == extensionName) return true;
                extensionType = extensionTypes.Next();
            }
            // No matching extension was found, so return false. 
            return false;
        }


    }
}

注意:serverObjectExtensionType.CLSID = "GetArea.GetArea";必须与命名空间类名一致

运行该程序完成arcserver注册。

六、测试soe

1、发布地图服务,并勾选对应的服务

ArcGis SOE(server object extensions)之REST Template初体验

2、通过URL查看

ArcGis SOE(server object extensions)之REST Template初体验

3、根据条件查询并到得面积

ArcGis SOE(server object extensions)之REST Template初体验

ArcGis SOE(server object extensions)之REST Template初体验

ArcGis SOE(server object extensions)之REST Template初体验

ArcGis SOE(server object extensions)之REST Template初体验

相关文章: