来源 目录
添加水印
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.SOESupport;
using System.Drawing;
namespace NetApplyWatermarkSOI
{
public class RESTErrorException : Exception
{
public RESTErrorException ( string msg ) : base(msg) { }
}
[ComVisible(true)]
[Guid("1095b617-7e22-490f-a1ba-42c463bdb0a1")]
[ClassInterface(ClassInterfaceType.None)]
[ServerObjectInterceptor("MapServer",
Description = "SOI example that applies watermark to exported images",
DisplayName = "DotNet Apply Watermark Sample SOI",
Properties = "")]
public class NetApplyWatermarkSOI : IServerObjectExtension, IRESTRequestHandler, IWebRequestHandler, IRequestHandler2, IRequestHandler
{
private string _soiName;
private IServerObjectHelper _soHelper;
private ServerLogger _serverLog;
private Dictionary<String, IServerObjectExtension> _extensionCache = new Dictionary<String, IServerObjectExtension>();
IServerEnvironment2 _serverEnvironment;
private string _outputDirectory = string.Empty;
public NetApplyWatermarkSOI ()
{
_soiName = this.GetType().Name;
}
public void Init ( IServerObjectHelper pSOH )
{
try
{
_soHelper = pSOH;
_serverLog = new ServerLogger();
try
{
var se4 = ServerEnvironment as IServerEnvironmentEx;
var dirInfos = se4.GetServerDirectoryInfos();
dirInfos.Reset();
object dirInfo = dirInfos.Next();
while (dirInfo != null)
{
var dinfo2 = dirInfo as IServerDirectoryInfo2;
if (null != dinfo2 && dinfo2.Type == esriServerDirectoryType.esriSDTypeOutput)
{
_outputDirectory = dinfo2.Path;
break;
}
dirInfo = dirInfos.Next();
}
}
catch (Exception ignore)
{
_outputDirectory = string.Empty;
}
_outputDirectory = _outputDirectory.Trim();
if (string.IsNullOrEmpty(_outputDirectory))
{
_serverLog.LogMessage(ServerLogger.msgType.error, _soiName + ".init()", 500, "OutputDirectory is empty or missing. Reset to default.");
_outputDirectory = "C:\\arcgisserver\\directories\\arcgisoutput";
}
_serverLog.LogMessage(ServerLogger.msgType.infoDetailed, _soiName + ".init()", 500, "OutputDirectory is " + _outputDirectory);
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".init()", 200, "Initialized " + _soiName + " SOI.");
}
catch (Exception e)
{
_serverLog.LogMessage(ServerLogger.msgType.error, _soiName + ".HandleRESTRequest()", 500, "Exception " + e.GetType().Name + " " + e.Message + " " + e.StackTrace);
throw;
}
}
public void Shutdown ()
{
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".init()", 200, "Shutting down " + _soiName + " SOI.");
}
#region REST interceptors
public string GetSchema ()
{
try
{
IRESTRequestHandler restRequestHandler = FindRequestHandlerDelegate<IRESTRequestHandler>();
if (restRequestHandler == null)
throw new RESTErrorException("Service handler not found");
return restRequestHandler.GetSchema();
}
catch (Exception e)
{
_serverLog.LogMessage(ServerLogger.msgType.error, _soiName + ".HandleRESTRequest()", 500, "Exception " + e.GetType().Name + " " + e.Message + " " + e.StackTrace);
throw;
}
}
public byte[] HandleRESTRequest ( string Capabilities, string resourceName, string operationName,
string operationInput, string outputFormat, string requestProperties, out string responseProperties )
{
try
{
responseProperties = null;
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".HandleRESTRequest()",
200, "Request received in Sample Object Interceptor for handleRESTRequest");
IRESTRequestHandler restRequestHandler = FindRequestHandlerDelegate<IRESTRequestHandler>();
if (restRequestHandler == null)
{
throw new RESTErrorException("Service handler not found");
}
var response = restRequestHandler.HandleRESTRequest(
Capabilities, resourceName, operationName, operationInput,
outputFormat, requestProperties, out responseProperties);
if (operationName.Equals("export", StringComparison.CurrentCultureIgnoreCase))
{
Image sourceImage = null;
if (outputFormat.Equals("image", StringComparison.CurrentCultureIgnoreCase))
{
sourceImage = Image.FromStream(new System.IO.MemoryStream(response));
var watermarker = new ApplyWatermark();
var watermarkedImage = watermarker.Mark(sourceImage, "(c) ESRI Inc.");
var newResponse = new System.IO.MemoryStream();
watermarkedImage.Save(newResponse, sourceImage.RawFormat);
return newResponse.GetBuffer();
}
else if (outputFormat.Equals("json", StringComparison.CurrentCultureIgnoreCase))
{
var responseString = System.Text.Encoding.UTF8.GetString(response);
var jo = new JsonObject(responseString);
string hrefString = null;
if (!jo.TryGetString("href", out hrefString))
throw new RESTErrorException("Export operation returned invalid response");
if (string.IsNullOrEmpty(hrefString))
throw new RESTErrorException("Export operation returned invalid response");
var outputImageFileLocation = GetOutputImageFileLocation(hrefString);
var watermarker = new ApplyWatermark();
Image watermarkedImage;
System.Drawing.Imaging.ImageFormat sourceImageFormat;
using( sourceImage = Image.FromFile(outputImageFileLocation))
{
sourceImageFormat = sourceImage.RawFormat;
watermarkedImage = watermarker.Mark(sourceImage, "(c) ESRI Inc.");
}
watermarkedImage.Save(outputImageFileLocation, sourceImageFormat);
watermarkedImage.Dispose();
return response;
}
else if (outputFormat.Equals("kmz", StringComparison.CurrentCultureIgnoreCase))
{
throw new RESTErrorException("Kmz format is not supported");
}
else
{
throw new RESTErrorException("Invalid operation parameters");
}
}
return response;
}
catch (RESTErrorException restException)
{
responseProperties = "{\"Content-Type\":\"text/plain;charset=utf-8\"}";
return System.Text.Encoding.UTF8.GetBytes(restException.Message);
}
catch (Exception e)
{
_serverLog.LogMessage(ServerLogger.msgType.error, _soiName + ".HandleRESTRequest()", 500, "Exception " + e.GetType().Name + " " + e.Message + " " + e.StackTrace);
throw;
}
}
#endregion
#region SOAP interceptors
public byte[] HandleStringWebRequest ( esriHttpMethod httpMethod, string requestURL,
string queryString, string Capabilities, string requestData,
out string responseContentType, out esriWebResponseDataType respDataType )
{
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".HandleStringWebRequest()",
200, "Request received in Sample Object Interceptor for HandleStringWebRequest");
IWebRequestHandler webRequestHandler = FindRequestHandlerDelegate<IWebRequestHandler>();
if (webRequestHandler != null)
{
return webRequestHandler.HandleStringWebRequest(
httpMethod, requestURL, queryString, Capabilities, requestData, out responseContentType, out respDataType);
}
responseContentType = null;
respDataType = esriWebResponseDataType.esriWRDTPayload;
return null;
}
public byte[] HandleBinaryRequest ( ref byte[] request )
{
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".HandleBinaryRequest()",
200, "Request received in Sample Object Interceptor for HandleBinaryRequest");
IRequestHandler requestHandler = FindRequestHandlerDelegate<IRequestHandler>();
if (requestHandler != null)
{
return requestHandler.HandleBinaryRequest(request);
}
return null;
}
public byte[] HandleBinaryRequest2 ( string Capabilities, ref byte[] request )
{
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".HandleBinaryRequest2()",
200, "Request received in Sample Object Interceptor for HandleBinaryRequest2");
IRequestHandler2 requestHandler = FindRequestHandlerDelegate<IRequestHandler2>();
if (requestHandler != null)
{
return requestHandler.HandleBinaryRequest2(Capabilities, request);
}
return null;
}
public string HandleStringRequest ( string Capabilities, string request )
{
_serverLog.LogMessage(ServerLogger.msgType.infoStandard, _soiName + ".HandleStringRequest()",
200, "Request received in Sample Object Interceptor for HandleStringRequest");
IRequestHandler requestHandler = FindRequestHandlerDelegate<IRequestHandler>();
if (requestHandler != null)
{
return requestHandler.HandleStringRequest(Capabilities, request);
}
return null;
}
#endregion
#region Utility code
private IServerEnvironment2 ServerEnvironment
{
get
{
if (_serverEnvironment == null)
{
UID uid = new UIDClass();
uid.Value = "{32D4C328-E473-4615-922C-63C108F55E60}";
IEnvironmentManager environmentManager = new EnvironmentManager() as IEnvironmentManager;
_serverEnvironment = environmentManager.GetEnvironment(uid) as IServerEnvironment2;
}
return _serverEnvironment;
}
}
private THandlerInterface FindRequestHandlerDelegate<THandlerInterface> () where THandlerInterface : class
{
try
{
IPropertySet props = ServerEnvironment.Properties;
String extensionName;
try
{
extensionName = (String)props.GetProperty("ExtensionName");
}
catch (Exception )
{
extensionName = null;
}
if (String.IsNullOrEmpty(extensionName))
{
return (_soHelper.ServerObject as THandlerInterface);
}
if (_extensionCache.ContainsKey(extensionName))
{
return (_extensionCache[extensionName] as THandlerInterface);
}
IServerObjectExtensionManager extnMgr = _soHelper.ServerObject as IServerObjectExtensionManager;
IServerObjectExtension soe = extnMgr.FindExtensionByTypeName(extensionName);
return (soe as THandlerInterface);
}
catch (Exception e)
{
_serverLog.LogMessage(ServerLogger.msgType.error,
_soiName + ".FindRequestHandlerDelegate()", 500, e.ToString());
throw;
}
}
#endregion
#region Watermarking code
private String GetOutputImageFileLocation ( String virtualPath )
{
var virtualPathParts = virtualPath.Split('/');
String imageFileLocation = _outputDirectory;
bool buildPath = false;
foreach (String virtualPathPart in virtualPathParts)
{
if (buildPath)
{
imageFileLocation += "\\" + virtualPathPart;
}
if (virtualPathPart.Equals("arcgisoutput", StringComparison.CurrentCultureIgnoreCase))
{
buildPath = true;
}
}
return imageFileLocation;
}
#endregion
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?