关于处理REST SOE请求
SOE的schema中的每个资源和操作都需要绑定一个请求处理函数。该函数包含了请求资源或调用操作的时候的逻辑代码。这些处理函数是你编写大部分ArcObjects代码的地方。
在REST SOE模板中,已经为你写好了一个资源的请求处理函数RootResHandler()。作为示例,它返回了一个简单的"hello:world" JSON字符串。你可以拷贝RootResHandler代码并对其进行修改以便使其满足schema中的其他资源。
资源的处理函数的结构是通过SOESupport库中的.Net委托定义的。这意味着所有的资源请求函数含有相同的签名,如下所示:
[C#]
private byte[] RootResHandler(NameValueCollection boundVariables, string outputFormat, string requestProperties, out string responseProperties) { ... }
正如资源的处理函数一样,操作的处理函数的签名也是由委托定义的。二者的委托很相似,唯一的区别是操作的处理函数的委托JSON对象的输入参数。这个JSON对象包含了执行该操作所需的所有的参数,比如当调用buffer操作的时候,这个JSON对象可能包含一个点以及距离信息。示例代码如下:
[C#]
public delegate byte[] OperationHandler(NameValueCollection boundVariables, JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties);
当在编写操作的处理函数代码的时候,你所应该注意的是你需要将JSON输入进行反序列化,然后用ArcObjects或其他库进行处理,最后将你的结果序列化称JSON。对JSON进行反序列化以及序列化是最有技巧的一部分。
以非JSON的形式返回结果
有时候可能你需要Web服务以非JSON得形式返回结果,比如返回图片。在这种情况下,你需要在response的属性中设置HTTP响应的Content-Type头。
首先,当定义资源或操作的时候,设置支持的输出格式。下面的代码定义了一个返回png图片的操作。
[C#]
RestOperation pngOper = new RestOperation("generatePng", null, new string[] { "png" } , PngHandler); soeResource.operations.Add(pngOper);
[C#]
private byte[] PngHandler(System.Collections.Specialized.NameValueCollection boundVariables, ESRI.ArcGIS.SOESupport.JsonObject operationInput, string outputFormat, string requestProperties, out string responseProperties) { responseProperties = "{\"Content-Type\" : \"image/png\",\"Content-Disposition\": \"attachment; filename=response.png\"}"; // Add code to generate and return a PNG. }