About the Publish an image service and set configurations Sample
[C#]
ISConfig.cs
using System; using System.IO; using ESRI.ArcGIS; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.GISClient; using ESRI.ArcGIS.Server; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.DataSourcesRaster; using System.Collections.Generic; using System.Net; using System.Text; using System.Runtime.InteropServices; using System.Web; namespace ISConfig { /// <summary> /// 1. Description: /// This sample demonstrate how to create an image service and set configurations based on data source types (raster dataset, mosaic dataset, raster layer); it also have additional features to start,stop,delete image service programmatically. /// The user running this utility needs access to data source. /// The application can be run locally on AGSServer machine or remotely. /// Source data must be accessible by the account that runs ArcGIS Server. Data is not copied to ArcGIS Server through this tool. /// CachingScheme/Metadata/thumbnail/iteminfo can't be defined through this tool. /// CachingScheme can be done through Caching geoprocessing tools. REST Metadata/thumbnail/iteminfo are not available through this app but can be developed using a similar approach to server admin endpoint /// The sample uses Raster API to populate dataset properties (used to construct service configuration), and can eitehr directly invoke rest Admin API to create service; or using AGSClient to create service. /// 2. Case sensitivity: /// (1) switches are case sensitive. /// (2) when publish a service, the service name is case sensitive /// 3. Usage: /// Run from command line environment. Usage. <>: required parameter; |: pick one. /// isconfig -o publish -h <host_adminurl> -d <datapath> -n <serviceName> /// isconfig -o <delete|start|stop|pause> -h <host> -n <serviceName> /// isconfig -o <list> -h <host> /// Example 1: isconfig -o publish -h "http://host:6080/arcgis/admin" -u "adminuser" -p "adminpassword" -d \\myserver\data\test.gdb\mdtest -n mdtest /// Example 2: isconfig -o stop -h myservername -u "adminuser" -p "adminpassword" -n mdtest /// Example 3: isconfig -o list -h myservername -u "adminuser" -p "adminpassword" /// </summary> class ISConfig { #region static variables private static string sourcePath = ""; //data source path: a raster dataset, a mosaic dataset private static string restAdmin = ""; //host admin url e.g. http://host:6080/arcgis/admin private static string serviceName = ""; //image service name private static IRasterDataset rasterDataset = null; private static IServerObjectAdmin soAdmin = null; private static string username = ""; //user name for publisher/admin private static string password = ""; //password for publisher/admin #endregion [STAThread] public static void Main(string[] args) { try { //args = new string[] { "-o", "publish", "-h", "http://server:6080/arcgis/admin", "-u", "adminuser", "-p", "adminuser", "-d", @"\\server\test\rgb.tif", "-n", "mdtest12356" }; //args = new string[] { "-o", "list", "-h", "http://server:6080/arcgis/admin", "-u", "adminuser", "-p", "adminuser" };//@"\\server\Images.gdb\mdtest" //validation if (!ValidateParams(args)) return; //license if (!InitLicense()) return; //retrieve parameters Retrieve_Params(args); string operation = args[1]; switch (operation.ToLower()) { case "publish": //CreateISConfig(); CreateISConfig_RESTAdmin(); break; case "delete": //DeleteService(); DeleteService_RESTAdmin(); break; case "start": //StartService(); StartService_RESTAdmin(); break; case "stop": //StopService(); StopService_RESTAdmin(); break; case "pause": PauseService(); break; case "list": //ListServices(); ListServices_RESTAdmin(); break; } } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } #region management operations /// <summary> /// create image service configuration /// </summary> private static void CreateISConfig() { try { if (!ConnectAGS(restAdmin)) return; //get source type esriImageServiceSourceType sourceType = GetSourceType(sourcePath); //connect to ArcGIS Server and create configuration IServerObjectConfiguration5 soConfig = (IServerObjectConfiguration5)soAdmin.CreateConfiguration(); //set general service parameters soConfig.Name = serviceName; soConfig.TypeName = "ImageServer"; soConfig.TargetCluster = "default"; soConfig.StartupType = esriStartupType.esriSTAutomatic; soConfig.IsPooled = true; soConfig.IsolationLevel = esriServerIsolationLevel.esriServerIsolationHigh; soConfig.MinInstances = 1; soConfig.MaxInstances = 2; //customize recycle properties IPropertySet propertySet_Recycle = soConfig.RecycleProperties; propertySet_Recycle.SetProperty("Interval", "24"); //path to the data IPropertySet propertySet = soConfig.Properties; IWorkspace workspace = ((IDataset)rasterDataset).Workspace; if (workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriRemoteDatabaseWorkspace) { IWorkspaceName2 wsName2 = ((IDataset)workspace).FullName as IWorkspaceName2; string connString = wsName2.ConnectionString; propertySet.SetProperty("ConnectionString", connString); propertySet.SetProperty("Raster", ((IDataset)rasterDataset).Name); } else propertySet.SetProperty("Path", sourcePath); propertySet.SetProperty("EsriImageServiceSourceType", sourceType.ToString()); //MIME+URL (virtual directory) propertySet.SetProperty("SupportedImageReturnTypes", "MIME+URL"); IEnumServerDirectory dirs = soAdmin.GetServerDirectories(); dirs.Reset(); IServerDirectory serverDir = dirs.Next(); while (serverDir != null) { if (((IServerDirectory2)serverDir).Type == esriServerDirectoryType.esriSDTypeOutput) { propertySet.SetProperty("OutputDir", serverDir.Path); propertySet.SetProperty("VirtualOutputDir", serverDir.URL); break; } serverDir = dirs.Next(); } //copy right propertySet.SetProperty("CopyRight", ""); //properties for a mosaic dataset; if (sourceType == esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset) { IFunctionRasterDataset functionRasterDataset = (IFunctionRasterDataset)rasterDataset; IPropertySet propDefaults = functionRasterDataset.Properties; object names, values; propDefaults.GetAllProperties(out names, out values); List<string> propNames = new List<string>(); propNames.AddRange((string[])names); if (propNames.Contains("MaxImageHeight")) propertySet.SetProperty("MaxImageHeight", propDefaults.GetProperty("MaxImageHeight"));//4100 if (propNames.Contains("MaxImageWidth")) propertySet.SetProperty("MaxImageWidth", propDefaults.GetProperty("MaxImageWidth"));//15000 if (propNames.Contains("AllowedCompressions")) propertySet.SetProperty("AllowedCompressions", propDefaults.GetProperty("AllowedCompressions"));//"None,JPEG,LZ77,LERC" if (propNames.Contains("DefaultResamplingMethod")) propertySet.SetProperty("DefaultResamplingMethod", propDefaults.GetProperty("DefaultResamplingMethod"));//0 if (propNames.Contains("DefaultCompressionQuality")) propertySet.SetProperty("DefaultCompressionQuality", propDefaults.GetProperty("DefaultCompressionQuality"));//75 if (propNames.Contains("MaxRecordCount")) propertySet.SetProperty("MaxRecordCount", propDefaults.GetProperty("MaxRecordCount"));//500 if (propNames.Contains("MaxMosaicImageCount")) propertySet.SetProperty("MaxMosaicImageCount", propDefaults.GetProperty("MaxMosaicImageCount"));//20 if (propNames.Contains("MaxDownloadSizeLimit")) propertySet.SetProperty("MaxDownloadSizeLimit", propDefaults.GetProperty("MaxDownloadSizeLimit"));//20 if (propNames.Contains("MaxDownloadImageCount")) propertySet.SetProperty("MaxDownloadImageCount", propDefaults.GetProperty("MaxDownloadImageCount"));//20 if (propNames.Contains("AllowedFields")) propertySet.SetProperty("AllowedFields", propDefaults.GetProperty("AllowedFields"));//"Name,MinPS,MaxPS,LowPS,HighPS,CenterX,CenterY" if (propNames.Contains("AllowedMosaicMethods")) propertySet.SetProperty("AllowedMosaicMethods", propDefaults.GetProperty("AllowedMosaicMethods"));//"Center,NorthWest,LockRaster,ByAttribute,Nadir,Viewpoint,Seamline" if (propNames.Contains("AllowedItemMetadata")) propertySet.SetProperty("AllowedItemMetadata", propDefaults.GetProperty("AllowedItemMetadata"));//"Full" if (propNames.Contains("AllowedMensurationCapabilities")) propertySet.SetProperty("AllowedMensurationCapabilities", propDefaults.GetProperty("AllowedMensurationCapabilities"));//"Full" if (propNames.Contains("DefaultCompressionTolerance")) propertySet.SetProperty("DefaultCompressionTolerance", propDefaults.GetProperty("DefaultCompressionTolerance"));//"0.01" LERC compression //propertySet.SetProperty("RasterFunctions", @"\\server\dir\rft1.rft.xml,\\server\dir\rft2.rft.xml");//"put raster function templates here, the first one is applied to exportimage request by default" //propertySet.SetProperty("RasterTypes", @"Raster Dataset,\\server\dir\art1.art.xml,\\server\dir\art2.art");//"put raster types here" //propertySet.SetProperty("DynamicImageWorkspace", @"\\server\dynamicImageDir"); //put the workspace that holds uploaded imagery here //propertySet.SetProperty("supportsOwnershipBasedAccessControl", true); //ownership based access control //propertySet.SetProperty("AllowOthersToUpdate", true); //allow others to update a catalog item //propertySet.SetProperty("AllowOthersToDelete", true); //allow others to delete a catalog item //propertySet.SetProperty("DownloadDir", ""); //put the download directory here //propertySet.SetProperty("VirutalDownloadDir", ""); //put the virtual download directory here } else { propertySet.SetProperty("MaxImageHeight", 4100); propertySet.SetProperty("MaxImageWidth", 15000); propertySet.SetProperty("AllowedCompressions", "None,JPEG,LZ77"); propertySet.SetProperty("DefaultResamplingMethod", 0); propertySet.SetProperty("DefaultCompressionQuality", 75);//for jpg compression propertySet.SetProperty("DefaultCompressionTolerance", 0.01);//for LERC compression // rasterDataset = OpenRasterDataset(sourcePath); IMensuration measure = new MensurationClass(); measure.Raster = ((IRasterDataset2)rasterDataset).CreateFullRaster(); string mensurationCaps = ""; if (measure.CanMeasure) mensurationCaps = "Basic"; if (measure.CanMeasureHeightBaseToTop) mensurationCaps += ",Base-Top Height"; if (measure.CanMeasureHeightBaseToTopShadow) mensurationCaps += ",Base-Top Shadow Height"; if (measure.CanMeasureHeightTopToTopShadow) mensurationCaps += ",Top-Top Shadow Height"; propertySet.SetProperty("AllowedMensurationCapabilities", mensurationCaps); //set mensuration here } //not cached propertySet.SetProperty("IsCached", false); propertySet.SetProperty("IgnoreCache", true); propertySet.SetProperty("UseLocalCacheDir", false); propertySet.SetProperty("ClientCachingAllowed", false); //propertySet.SetProperty("DEM", ""); //put the elevation raster dataset or service for 3D mensuration, may need to add 3D to AllowedMensurationCapabilities //convert colormap to RGB or not propertySet.SetProperty("ColormapToRGB", false); //whether to return jpgs for all jpgpng request or not propertySet.SetProperty("ReturnJPGPNGAsJPG", false); //allow server to process client defined function propertySet.SetProperty("AllowFunction", true); //allow raster function //capabilities if (sourceType == esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset) soConfig.Info.SetProperty("Capabilities", "Image,Catalog,Metadata,Mensuration"); //Full set: Image,Catalog,Metadata,Download,Pixels,Edit,Mensuration else soConfig.Info.SetProperty("Capabilities", "Image,Metadata,Mensuration"); //enable wcs, assume data has spatial reference soConfig.set_ExtensionEnabled("WCSServer", true); IPropertySet wcsInfo = new PropertySetClass(); wcsInfo.SetProperty("WebEnabled", "true"); soConfig.set_ExtensionInfo("WCSServer", wcsInfo); IPropertySet propertySetWCS = new PropertySetClass(); propertySetWCS.SetProperty("CustomGetCapabilities", false); propertySetWCS.SetProperty("PathToCustomGetCapabilitiesFiles", ""); soConfig.set_ExtensionProperties("WCSServer", propertySetWCS); //enable wms soConfig.set_ExtensionEnabled("WMSServer", true); IPropertySet wmsInfo = new PropertySetClass(); wmsInfo.SetProperty("WebEnabled", "true"); soConfig.set_ExtensionInfo("WMSServer", wmsInfo); IPropertySet propertySetWMS = new PropertySetClass(); propertySetWMS.SetProperty("name", "WMS"); //set other properties here soConfig.set_ExtensionProperties("WMSServer", propertySetWMS); //add configuration and start soAdmin.AddConfiguration(soConfig); soAdmin.StartConfiguration(serviceName, "ImageServer"); if (soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status == esriConfigurationStatus.esriCSStarted) Console.WriteLine("{0} on {1} has been configured and started.", serviceName, restAdmin); else Console.WriteLine("{0} on {1} was configured but can not be started, please investigate.", serviceName, restAdmin); if (rasterDataset != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterDataset); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } /// <summary> /// delete a service /// </summary> private static void DeleteService() { try { if (!ConnectAGS(restAdmin)) return; if (!ValidateServiceName(soAdmin, ref serviceName, restAdmin)) return; soAdmin.DeleteConfiguration(serviceName, "ImageServer"); Console.WriteLine("{0} on {1} was deleted successfully.", serviceName, restAdmin); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } /// <summary> /// start a service /// </summary> private static void StartService() { try { if (!ConnectAGS(restAdmin)) return; if (!ValidateServiceName(soAdmin, ref serviceName, restAdmin)) return; soAdmin.StartConfiguration(serviceName, "ImageServer"); if (soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status == esriConfigurationStatus.esriCSStarted) Console.WriteLine("{0} on {1} was started successfully.", serviceName, restAdmin); else Console.WriteLine("{0} on {1} couldn't be started, please investigate.", serviceName, restAdmin); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } /// <summary> /// stop a service /// </summary> private static void StopService() { try { if (!ConnectAGS(restAdmin)) return; if (!ValidateServiceName(soAdmin, ref serviceName, restAdmin)) return; soAdmin.StopConfiguration(serviceName, "ImageServer"); if (soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status == esriConfigurationStatus.esriCSStopped) Console.WriteLine("{0} on {1} was stopped successfully.", serviceName, restAdmin); else Console.WriteLine("{0} on {1} couldn't be stopped, please investigate.", serviceName, restAdmin); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } /// <summary> /// pause a service /// </summary> private static void PauseService() { try { if (!ConnectAGS(restAdmin)) return; if (!ValidateServiceName(soAdmin, ref serviceName, restAdmin)) return; if ((soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status == esriConfigurationStatus.esriCSStopped)) { Console.WriteLine("{0} on {1} is currently stopped --- not paused.", serviceName, restAdmin); return; } soAdmin.PauseConfiguration(serviceName, "ImageServer"); if (soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status == esriConfigurationStatus.esriCSPaused) Console.WriteLine("{0} on {1} was paused successfully.", serviceName, restAdmin); else Console.WriteLine("{0} on {1} couldn't be paused, please investigate.", serviceName, restAdmin); } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } /// <summary> /// List services /// </summary> private static void ListServices() { try { if (!ConnectAGS(restAdmin)) return; IEnumServerObjectConfiguration enumConfigs = soAdmin.GetConfigurations(); enumConfigs.Reset(); IServerObjectConfiguration soConfig = enumConfigs.Next(); Console.WriteLine("ArcGIS Server {0} has the following image services:", restAdmin); while (soConfig != null) { if (soConfig.TypeName == "ImageServer") Console.WriteLine("{0}", soConfig.Name); soConfig = enumConfigs.Next(); } } catch (Exception exc) { Console.WriteLine("Error: {0}", exc.Message); } } #endregion #region validation etc. /// <summary> /// connect to ags server /// </summary> /// <param name="host">host</param> /// <returns>true if connected</returns> private static bool ConnectAGS(string host) { try { IPropertySet propertySet = new PropertySetClass(); propertySet.SetProperty("url", host); propertySet.SetProperty("ConnectionMode", esriAGSConnectionMode.esriAGSConnectionModePublisher); propertySet.SetProperty("ServerType", esriAGSServerType.esriAGSServerTypeDiscovery); propertySet.SetProperty("user", username); propertySet.SetProperty("password", password); propertySet.SetProperty("ALLOWINSECURETOKENURL", true); IAGSServerConnectionName3 connectName = new AGSServerConnectionNameClass() as IAGSServerConnectionName3; connectName.ConnectionProperties = propertySet; IAGSServerConnectionAdmin agsAdmin = ((IName)connectName).Open() as IAGSServerConnectionAdmin; soAdmin = agsAdmin.ServerObjectAdmin; return true; } catch (Exception exc) { Console.WriteLine("Error: Couldn't connect to AGSServer: {0}. Message: {1}", host, exc.Message); return false; } } /// <summary> /// Validate ServiceName /// </summary> /// <returns>Convert the config name to the correct case and returns true; if not exist in any cases, returns false </returns> private static bool ValidateServiceName(IServerObjectAdmin soAdmin, ref string serviceName, string host) { IEnumServerObjectConfiguration enumConfigs = soAdmin.GetConfigurations(); enumConfigs.Reset(); IServerObjectConfiguration soConfig = enumConfigs.Next(); while (soConfig != null) { if (soConfig.Name.ToUpper() == serviceName.ToUpper()) { serviceName = soConfig.Name; return true; } soConfig = enumConfigs.Next(); } Console.WriteLine("Configuration {0} on {1} can not be found.", serviceName, host); return false; } /// <summary> /// Validate input parameters /// </summary> /// <param name="args">args</param> /// <returns>validation result</returns> private static bool ValidateParams(string[] args) { //at least two params if (args.Length == 0) { ShowUsage(); Console.WriteLine("press any key to continue ..."); Console.ReadKey(); return false; } else if (args.Length < 2) // at least -o action { ShowUsage(); return false; } // must start with -o string[] operations = new string[] { "publish", "delete", "start", "stop", "pause", "list" }; if ((!args[0].StartsWith("-o")) || (!strInArray(args[1].ToLower(), operations))) { Console.WriteLine("Incorrect operation"); ShowUsage(); return false; } // for stop/start/pause/list, must contains "-n" and argument length is 4 if ((args[1].ToLower() == "stop") || (args[1].ToLower() == "start") || (args[1].ToLower() == "pause") || (args[1].ToLower() == "delete")) { if (!strInArray("-h", args)) { Console.WriteLine("Missing host server -h"); return false; } if (!strInArray("-n", args)) { Console.WriteLine("Missing service name switch -n"); return false; } if (!strInArray("-u", args)) { Console.WriteLine("Missing admin/publisher username switch -u"); return false; } if (!strInArray("-p", args)) { Console.WriteLine("Missing admin/publisher name switch -p"); return false; } //if (args.Length > 8) //{ // Console.WriteLine("Too many arguments"); // return false; //} } // for publish, must contains "-d" "-n" and argument length is 6 if (args[1].ToLower() == "publish") { if (!strInArray("-d", args)) { Console.WriteLine("Missing data source switch -d"); return false; } if (!strInArray("-n", args)) { Console.WriteLine("Missing service name switch -n"); return false; } if (!strInArray("-u", args)) { Console.WriteLine("Missing admin/publisher username switch -u"); return false; } if (!strInArray("-p", args)) { Console.WriteLine("Missing admin/publisher name switch -p"); return false; } //if (args.Length > 12) //{ // Console.WriteLine("Too many arguments"); // return false; //} } // validate each parameter: host, sourcepath, configname string[] parameters = new string[] { "-h", "-d", "-n", "-u", "-p" }; for (int i = 2; i < args.Length; i++) { switch (args[i]) { case "-h": if (i == args.Length - 1) { Console.WriteLine("Missing host parameter, switch -h"); return false; } else if (strInArray(args[i + 1], parameters)) { Console.WriteLine("Missing host parameter, switch -h"); return false; } ++i; break; case "-d": if (i == args.Length - 1) { Console.WriteLine("Missing data source parameter, switch -d"); return false; } else if (strInArray(args[i + 1], parameters)) { Console.WriteLine("Missing data source parameter, switch -d"); return false; } ++i; break; case "-n": if (i == args.Length - 1) { Console.WriteLine("Missing service name parameter, switch -n"); return false; } else if (strInArray(args[i + 1], parameters)) { Console.WriteLine("Missing service name parameter, switch -n"); return false; } ++i; break; case "-u": if (i == args.Length - 1) { Console.WriteLine("Missing admin/publisher username parameter, switch -u"); return false; } else if (strInArray(args[i + 1], parameters)) { Console.WriteLine("Missing admin/publisher username parameter, switch -u"); return false; } ++i; break; case "-p": if (i == args.Length - 1) { Console.WriteLine("Missing admin/publisher password parameter, switch -p"); return false; } else if (strInArray(args[i + 1], parameters)) { Console.WriteLine("Missing admin/publisher password parameter, switch -p"); return false; } ++i; break; default: Console.WriteLine("Incorrect parameter switch: {0} is not a recognized.", args[i]); return false; } } return true; } /// <summary> /// string in array /// </summary> /// <param name="name"></param> /// <param name="nameArray"></param> /// <returns></returns> private static bool strInArray(string name, string[] nameArray) { for (int i = 0; i < nameArray.Length; i++) { if (nameArray[i] == name) return true; } return false; } /// <summary> /// initialize license /// </summary> /// <returns>status</returns> private static bool InitLicense() { RuntimeManager.Bind(ProductCode.Desktop); IAoInitialize aoInit = new AoInitializeClass(); esriLicenseStatus status = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeBasic); if (status != esriLicenseStatus.esriLicenseCheckedOut) { Console.WriteLine("License initialization error"); return false; } else return true; } #endregion #region helper methods /// <summary> /// Retrieve parameters /// </summary> /// <param name="args">args</param> private static void Retrieve_Params(string[] args) { for (int i = 2; i < args.Length; i++) { switch (args[i]) { case "-h": restAdmin = args[++i]; break; case "-d": sourcePath = args[++i]; break; case "-n": serviceName = args[++i]; break; case "-u": username = args[++i]; break; case "-p": password = args[++i]; break; } } } /// <summary> /// Get Source Type /// </summary> /// <param name="sourcePath">path of the data source</param> /// <returns>data source type</returns> private static esriImageServiceSourceType GetSourceType(string sourcePath) { if (sourcePath.ToLower().EndsWith(".lyr")) return esriImageServiceSourceType.esriImageServiceSourceTypeLayer; else { FileInfo fileInfo = new FileInfo(sourcePath); OpenRasterDataset(fileInfo.DirectoryName, fileInfo.Name); if (rasterDataset is IMosaicDataset) return esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset; else return esriImageServiceSourceType.esriImageServiceSourceTypeDataset; } } /// <summary> /// Open Raster Dataset /// </summary> /// <param name="path">path of the dataset</param> /// <param name="rasterDSName">name of the dataset</param> private static void OpenRasterDataset(String path, String rasterDSName) { //this is why the utility user needs access to data source. image service configurations varies among data sources. IWorkspaceFactory workspaceFactory = null; IWorkspace workspace = null; IRasterWorkspaceEx rasterWorkspaceEx = null; Type factoryType = null; try { switch (path.Substring(path.Length - 4, 4).ToLower()) // a path can never be shorter than 4 characters, isn't it? c:\a { case ".gdb": factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory"); workspaceFactory = Activator.CreateInstance(factoryType) as IWorkspaceFactory; workspace = workspaceFactory.OpenFromFile(path, 1); rasterWorkspaceEx = (IRasterWorkspaceEx)workspace; rasterDataset = rasterWorkspaceEx.OpenRasterDataset(rasterDSName); break; case ".sde": factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory"); workspaceFactory = Activator.CreateInstance(factoryType) as IWorkspaceFactory; workspace = workspaceFactory.OpenFromFile(path, 1); rasterWorkspaceEx = (IRasterWorkspaceEx)workspace; rasterDataset = rasterWorkspaceEx.OpenRasterDataset(rasterDSName); break; default: factoryType = Type.GetTypeFromProgID("esriDataSourcesRaster.RasterWorkspaceFactory"); workspaceFactory = Activator.CreateInstance(factoryType) as IWorkspaceFactory; workspace = workspaceFactory.OpenFromFile(path, 1); IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspace; rasterDataset = rasterWorkspace.OpenRasterDataset(rasterDSName); break; } } catch (Exception) { throw new ArgumentException("Failed to open source data"); } } /// <summary> /// Show usage /// </summary> private static void ShowUsage() { Console.WriteLine(); Console.WriteLine("ArcObject Sample: command line image service publishing and configuration utility (10.1 ArcGIS Server). Data is not copied to server using this tool. source data must be accessible by ArcGIS Server running account. CachingScheme can't be defined through this tool but can be done through Caching geoprocessing tools. REST Metadata/thumbnail/iteminfo resource are not available through this app but can be developed using a similar approach to server admin endpoint."); Console.WriteLine(); Console.WriteLine("Usage. <>: required parameter; |: pick one."); Console.WriteLine("isconfig -o publish -h <host_admin_url> -u <adminuser> -p <adminpassword> -d <datapath> -n <serviceName>"); Console.WriteLine("isconfig -o <delete|start|stop> -h <host_admin_url> -u <adminuser> -p <adminpassword> -n <serviceName>"); Console.WriteLine("isconfig -o <list> -h <host_admin_url> -u <adminuser> -p <adminpassword>"); Console.WriteLine("e.g. isconfig -o list -h http://myserver:6080/arcgis/admin -u username -p password"); } #endregion #region REST Admin based http requests /// <summary> /// Generate a token /// </summary> /// <param name="restAdmin">REST admin url: http://server:port/arcigs/admin</param> /// <returns>A token that has default expiration time</returns> public static string GenerateAGSToken_RESTAdmin() { try { string loginUrl = restAdmin + "/generateToken"; WebRequest request = WebRequest.Create(loginUrl); request.Method = "POST"; string credential = "username=" + username + "&password=" + password + "&client=requestip&expiration=&f=json"; byte[] content = Encoding.UTF8.GetBytes(credential); request.ContentLength = content.Length; request.ContentType = "application/x-www-form-urlencoded"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); int index1 = result.IndexOf("token\":\"") + "token\":\"".Length; int index2 = result.IndexOf("\"", index1); //Dictionary<string, object> dictResult = DeserializeJSON(result, true); string token = result.Substring(index1, index2 - index1); return token; } catch { return ""; } } /// <summary> /// Create arcgis server folder /// </summary> /// <param name="restAdmin">REST admin url, e.g. http://server:port/arcgis/admin</param> /// <param name="folderName">Folder name</param> /// <param name="description">Description of the folder</param> /// <returns>True if successfully created</returns> private static bool CreateServerFolder_RESTAdmin(string folderName, string description) { try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string folderUrl = restAdmin + "/services/" + folderName + "?f=json&token=" + token; WebRequest request = WebRequest.Create(folderUrl); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); if (!result.Contains("error")) return true; else { string createFolderUrl = restAdmin + "/services/createFolder"; request = WebRequest.Create(createFolderUrl); string postcontent = string.Format("folderName={0}&description={1}&f=pjson&token={2}", folderName, description, token); Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; //((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); response = request.GetResponse(); responseStream = response.GetResponseStream(); reader = new StreamReader(responseStream); result = reader.ReadToEnd(); return result.Contains("success"); } } catch { return false; } } private static void GetServerDirectory_RESTAdmin(string dirType, out string physicalPath, out string virtualPath) { physicalPath = ""; virtualPath = ""; try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string directoryAlias = dirType.ToString().ToLower().Replace("esrisdtype", "arcgis"); string directoryUrl = restAdmin + "/system/directories/" + directoryAlias + "?f=json&token=" + token; WebRequest request = WebRequest.Create(directoryUrl); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); try { int index = result.IndexOf(dirType); int index1 = result.IndexOf("physicalPath\":\"", index) + "physicalPath\":\"".Length; int index2 = result.IndexOf("\"", index1); physicalPath = result.Substring(index1, index2 - index1); index1 = result.IndexOf("virtualPath\":\"", index) + "virtualPath\":\"".Length; index2 = result.IndexOf("\"", index1); virtualPath = result.Substring(index1, index2 - index1); } catch { } } catch { } } /// <summary> /// Delete Service /// </summary> /// <param name="restAdmin">REST admin url, e.g. http://server:port/arcgis/admin</param> /// <param name="serviceName">Service Name</param> /// <param name="serviceType">Server Type, e.g. ImageServer, MapServer, GeoDataServer, GeoprocessingServer, GeometryServer, etc</param> /// <returns>True if successfully deleted</returns> public static bool DeleteService_RESTAdmin() { try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string serviceUrl = restAdmin + "/services/" + serviceName + "." + "ImageServer" + "/delete"; WebRequest request = WebRequest.Create(serviceUrl); string postcontent = "f=pjson&token=" + token; Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; //((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); Console.WriteLine("delete service {0}, result: {1}", serviceName, result); return result.Contains("success"); } catch { return false; } } public static bool StartService_RESTAdmin() { try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string serviceUrl = restAdmin + "/services/" + serviceName + "." + "ImageServer" + "/start"; WebRequest request = WebRequest.Create(serviceUrl); string postcontent = "f=pjson&token=" + token; Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; //((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); Console.WriteLine("start service {0}, result: {1}", serviceName, result); return result.Contains("success"); } catch { return false; } } public static bool StopService_RESTAdmin() { try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string serviceUrl = restAdmin + "/services/" + serviceName + "." + "ImageServer" + "/stop"; WebRequest request = WebRequest.Create(serviceUrl); string postcontent = "f=pjson&token=" + token; Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; //((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); Console.WriteLine("stop service {0}, result: {1}", serviceName, result); return result.Contains("success"); } catch { return false; } } public static void ListServices_RESTAdmin() { Console.WriteLine("List of image services: "); ListServices_RESTAdmin(restAdmin + "/services", ""); } public static void ListServices_RESTAdmin(string root, string folder) { try { string token = GenerateAGSToken_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string serviceUrl = root + "/" + folder; WebRequest request = WebRequest.Create(serviceUrl); string postcontent = "f=json&token=" + token; Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; //((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); int indexfolder1 = result.IndexOf("folders\":["); if (indexfolder1 != -1) { indexfolder1 += "folders\":[".Length; int indexfolder2 = result.IndexOf("]", indexfolder1); string folderlist = result.Substring(indexfolder1, indexfolder2 - indexfolder1); string[] folders = folderlist.Replace("\"", "").Split(','); foreach (string subfolder in folders) ListServices_RESTAdmin(serviceUrl, subfolder); } int index = result.IndexOf("services"); while (index > 0) { try { int index1 = result.IndexOf("folderName\":\"", index); if (index1 == -1) break; index1 += "folderName\":\"".Length; int index2 = result.IndexOf("\"", index1); string folderName = result.Substring(index1, index2 - index1); index1 = result.IndexOf("serviceName\":\"", index2) + "serviceName\":\"".Length; index2 = result.IndexOf("\"", index1); string serviceName = result.Substring(index1, index2 - index1); index1 = result.IndexOf("type\":\"", index2) + "type\":\"".Length; index2 = result.IndexOf("\"", index1); string serviceType = result.Substring(index1, index2 - index1); if (serviceType == "ImageServer") { if (folderName == "/") //root Console.WriteLine(serviceName); else Console.WriteLine(folderName + "/" + serviceName); } index = index2; } catch { } } } catch { } } /// <summary> /// create image service /// </summary> /// <param name="restAdmin">host machine name (windows or linux)</param> /// <param name="sourcePath">data source path, must be windows path (linux path is constructed automaticlly by windows path)</param> /// <param name="serviceName">configuration name</param> /// <param name="createImageServiceParams">Cration parameters, e.g. raster functions, colormaptorgb, raster types, dem, dynamicimageworkspace, customized propertyset etc</param> /// <returns>true if created successfully</returns> public static bool CreateISConfig_RESTAdmin() { //string restAdmin, string username, string password, string sourcePath, string serviceName try { esriImageServiceSourceType sourceType = GetSourceType(sourcePath); string serviceType = "ImageServer"; //DeleteService_RESTAdmin(); restAdmin = restAdmin.EndsWith("/") ? restAdmin.Substring(0, restAdmin.Length - 1) : restAdmin; string serviceFolder = ""; if (serviceName.Contains("/")) { serviceFolder = serviceName.Substring(0, serviceName.IndexOf("/")); CreateServerFolder_RESTAdmin(serviceFolder, ""); serviceName = serviceName.Substring(serviceFolder.Length + 1, serviceName.Length - serviceFolder.Length - 1); } string createServiceUrl = ""; if (serviceFolder == "") createServiceUrl = restAdmin + "/services/createService"; else createServiceUrl = restAdmin + "/services/" + serviceFolder + "/createService"; //createServiceUrl = "http://wenxue:6080/arcgis/admin/services/createService"; WebRequest request = WebRequest.Create(createServiceUrl); //DataSourceIsReadOnly StringBuilder sBuilder = new StringBuilder(); sBuilder.Append("{"); sBuilder.AppendFormat("{0}: {1},", QuoteString("serviceName"), QuoteString(serviceName)); sBuilder.AppendFormat("{0}: {1},", QuoteString("type"), QuoteString(serviceType)); sBuilder.AppendFormat("{0}: {1},", QuoteString("description"), QuoteString("")); sBuilder.AppendFormat("{0}: {1},", QuoteString("clusterName"), QuoteString("default")); sBuilder.AppendFormat("{0}: {1},", QuoteString("minInstancesPerNode"), 1); sBuilder.AppendFormat("{0}: {1},", QuoteString("maxInstancesPerNode"), 2); sBuilder.AppendFormat("{0}: {1},", QuoteString("maxWaitTime"), 10000); sBuilder.AppendFormat("{0}: {1},", QuoteString("maxIdleTime"), 1800); sBuilder.AppendFormat("{0}: {1},", QuoteString("maxUsageTime"), 600); sBuilder.AppendFormat("{0}: {1},", QuoteString("loadBalancing"), QuoteString("ROUND_ROBIN")); sBuilder.AppendFormat("{0}: {1},", QuoteString("isolationLevel"), QuoteString("HIGH")); sBuilder.AppendFormat("{0}: {1},", QuoteString("configuredState"), QuoteString("STARTED")); string webCapabilities = ""; if (sourceType == esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset) webCapabilities = "Image,Catalog,Metadata,Mensuration";//full list "Image,Catalog,Metadata,Download,Pixels,Edit,Mensuration" else webCapabilities = "Image,Metadata,Mensuration"; sBuilder.AppendFormat("{0}: {1},", QuoteString("capabilities"), QuoteString(webCapabilities)); sBuilder.AppendFormat("{0}: {1}", QuoteString("properties"), "{"); sBuilder.AppendFormat("{0}: {1},", QuoteString("supportedImageReturnTypes"), QuoteString("MIME+URL")); IWorkspace workspace = ((IDataset)rasterDataset).Workspace; if (workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriRemoteDatabaseWorkspace) { IWorkspaceName2 wsName2 = ((IDataset)workspace).FullName as IWorkspaceName2; string connString = wsName2.ConnectionString; sBuilder.AppendFormat("{0}: {1},", QuoteString("connectionString"), QuoteString(connString)); sBuilder.AppendFormat("{0}: {1},", QuoteString("raster"), QuoteString(((IDataset)rasterDataset).Name)); } else sBuilder.AppendFormat("{0}: {1},", QuoteString("path"), QuoteString(sourcePath.Replace("\\", "\\\\"))); sBuilder.AppendFormat("{0}: {1},", QuoteString("esriImageServiceSourceType"), QuoteString(sourceType.ToString())); string outputDir = ""; string virtualDir = ""; GetServerDirectory_RESTAdmin("arcgisoutput", out outputDir, out virtualDir); string cacheDir = ""; string virtualCacheDir = ""; GetServerDirectory_RESTAdmin("arcgisoutput", out cacheDir, out virtualCacheDir); if (outputDir != "") { sBuilder.AppendFormat("{0}: {1},", QuoteString("outputDir"), QuoteString(outputDir)); sBuilder.AppendFormat("{0}: {1},", QuoteString("virtualOutputDir"), QuoteString(virtualDir));//http://istest2:6080/arcgis/server/arcgisoutput")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("dynamicImageWorkspace"), QuoteString(@"D:\UploadDir")); } //if (cacheDir != "") //{ // sBuilder.AppendFormat("{0}: {1},", QuoteString("cacheDir"), QuoteString(cacheDir)); // sBuilder.AppendFormat("{0}: {1},", QuoteString("virtualCacheDir"), QuoteString(virtualCacheDir));//http://istest2:6080/arcgis/server/arcgisoutput")); //} sBuilder.AppendFormat("{0}: {1},", QuoteString("copyright"), QuoteString("")); //properties for a mosaic Dataset; if (sourceType == esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset) { IFunctionRasterDataset functionRasterDataset = (IFunctionRasterDataset)rasterDataset; IPropertySet propDefaults = functionRasterDataset.Properties; object names, values; propDefaults.GetAllProperties(out names, out values); List<string> propNames = new List<string>(); propNames.AddRange((string[])names); if (propNames.Contains("AllowedCompressions")) sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedCompressions"), QuoteString(propDefaults.GetProperty("AllowedCompressions").ToString()));//string if (propNames.Contains("MaxImageHeight")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageHeight"), QuoteString(propDefaults.GetProperty("MaxImageHeight").ToString()));//should be int if (propNames.Contains("MaxImageWidth")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageWidth"), QuoteString(propDefaults.GetProperty("MaxImageWidth").ToString()));//should be int if (propNames.Contains("DefaultResamplingMethod")) sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultResamplingMethod"), QuoteString(propDefaults.GetProperty("DefaultResamplingMethod").ToString()));//should be int if (propNames.Contains("DefaultCompressionQuality")) sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionQuality"), QuoteString(propDefaults.GetProperty("DefaultCompressionQuality").ToString()));//should be int if (propNames.Contains("MaxRecordCount")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxRecordCount"), QuoteString(propDefaults.GetProperty("MaxRecordCount").ToString()));//should be int if (propNames.Contains("MaxMosaicImageCount")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxMosaicImageCount"), QuoteString(propDefaults.GetProperty("MaxMosaicImageCount").ToString()));//should be int if (propNames.Contains("MaxDownloadImageCount")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxDownloadImageCount"), QuoteString(propDefaults.GetProperty("MaxDownloadImageCount").ToString()));//should be int if (propNames.Contains("MaxDownloadSizeLimit")) sBuilder.AppendFormat("{0}: {1},", QuoteString("MaxDownloadSizeLimit"), QuoteString(propDefaults.GetProperty("MaxDownloadSizeLimit").ToString()));//should be int if (propNames.Contains("AllowedFields")) sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedFields"), QuoteString(propDefaults.GetProperty("AllowedFields").ToString()));//string if (propNames.Contains("AllowedMosaicMethods")) sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedMosaicMethods"), QuoteString(propDefaults.GetProperty("AllowedMosaicMethods").ToString()));//string if (propNames.Contains("AllowedItemMetadata")) sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedItemMetadata"), QuoteString(propDefaults.GetProperty("AllowedItemMetadata").ToString()));//string if (propNames.Contains("AllowedMensurationCapabilities")) sBuilder.AppendFormat("{0}: {1},", QuoteString("AllowedMensurationCapabilities"), QuoteString(propDefaults.GetProperty("AllowedMensurationCapabilities").ToString()));//string if (propNames.Contains("DefaultCompressionTolerance")) sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionTolerance"), QuoteString(propDefaults.GetProperty("DefaultCompressionTolerance").ToString()));//string //sBuilder.AppendFormat("{0}: {1},", QuoteString("downloadDir"), QuoteString(@"c:\temp"));//string //sBuilder.AppendFormat("{0}: {1},", QuoteString("virutalDownloadDir"), QuoteString(@"http://localhost/temp");//string } else if (sourceType != esriImageServiceSourceType.esriImageServiceSourceTypeCatalog) //not iscdef { sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedCompressions"), QuoteString("None,JPEG,LZ77")); sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageHeight"), QuoteString("4100"));//should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageWidth"), QuoteString("15000"));//should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultResamplingMethod"), QuoteString("0"));//should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionQuality"), QuoteString("75"));//should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionTolerance"), QuoteString("0.01"));//should be int IMensuration measure = new MensurationClass(); measure.Raster = ((IRasterDataset2)rasterDataset).CreateFullRaster(); string mensurationCaps = ""; if (measure.CanMeasure) mensurationCaps = "Basic"; if (measure.CanMeasureHeightBaseToTop) mensurationCaps += ",Base-Top Height"; if (measure.CanMeasureHeightBaseToTopShadow) mensurationCaps += ",Base-Top Shadow Height"; if (measure.CanMeasureHeightTopToTopShadow) mensurationCaps += ",Top-Top Shadow Height"; sBuilder.AppendFormat("{0}: {1},", QuoteString("AllowedMensurationCapabilities"), QuoteString(mensurationCaps));//string } //sBuilder.AppendFormat("{0}: {1},", QuoteString("dEM"), QuoteString(@"c:\elevation\elevation.tif")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("supportsOwnershipBasedAccessControl"), QuoteString("true")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("allowOthersToUpdate"), QuoteString("true")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("allowOthersToDelete"), QuoteString("true")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("cacheOnDemand"), QuoteString("false")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("isCached"), QuoteString("false")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("ignoreCache"), QuoteString("true")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("useLocalCacheDir"), QuoteString("false")); //sBuilder.AppendFormat("{0}: {1},", QuoteString("clientCachingAllowed"), QuoteString("false")); sBuilder.AppendFormat("{0}: {1},", QuoteString("colormapToRGB"), QuoteString("false")); sBuilder.AppendFormat("{0}: {1},", QuoteString("returnJPGPNGAsJPG"), QuoteString("false")); sBuilder.AppendFormat("{0}: {1},", QuoteString("allowFunction"), QuoteString("true")); string rasterFunctions = ""; sBuilder.AppendFormat("{0}: {1},", QuoteString("rasterFunctions"), QuoteString(rasterFunctions).Replace("\\", "\\\\")); string rasterTypes = ""; sBuilder.AppendFormat("{0}: {1}", QuoteString("rasterTypes"), QuoteString(rasterTypes).Replace("\\", "\\\\")); sBuilder.Append("},"); bool enableWCS = true; bool enableWMS = true; sBuilder.AppendFormat("{0}: {1}", QuoteString("extensions"), "[{\"typeName\":\"WCSServer\",\"enabled\":\"" + enableWCS + "\",\"capabilities\":null,\"properties\":{}},{\"typeName\":\"WMSServer\",\"enabled\":\"" + enableWMS + "\",\"capabilities\":null,\"properties\":{\"title\":\"WMS\",\"name\":\"WMS\",\"inheritLayerNames\":\"false\"}}"); sBuilder.Append("],"); sBuilder.AppendFormat("{0}: {1}", QuoteString("datasets"), "[]"); sBuilder.Append("}"); string postcontent = HttpUtility.UrlEncode(sBuilder.ToString()); string token = GenerateAGSToken_RESTAdmin(); postcontent = "service=" + postcontent + "&startAfterCreate=on&f=pjson&token=" + token; Byte[] content = Encoding.UTF8.GetBytes(postcontent); request.ContentLength = content.Length; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(content, 0, content.Length); requestStream.Close(); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream); string result = reader.ReadToEnd(); Console.WriteLine("create service:" + serviceName + " result:" + result); //wait for 5 seconds to reduce latency issue //System.Threading.Thread.Sleep(5000); return result.Contains("success"); } catch (Exception exc) { Console.WriteLine(exc.Message); return false; } } private static string QuoteString(string input) { return "\"" + input + "\""; } private static string DeQuoteString(string input) { if (input.StartsWith("\"")) return input.Substring(1, input.Length - 2).Trim(); else return input; } #endregion } }
[Visual Basic .NET]
ISConfig.vb
Imports System.IO Imports ESRI.ArcGIS Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.GISClient Imports ESRI.ArcGIS.Server Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.DataSourcesGDB Imports ESRI.ArcGIS.DataSourcesRaster Imports System.Collections.Generic Imports System.Net Imports System.Text Imports System.Runtime.InteropServices Imports System.Web ''' <summary> ''' 1. Description: ''' This sample demonstrate how to create an image service and set configurations based on data source types (raster dataset, mosaic dataset, raster layer); it also have additional features to start,stop,delete image service programmatically. ''' The user running this utility needs access to data source. ''' The application can be run locally on AGSServer machine or remotely. ''' Source data must be accessible by the account that runs ArcGIS Server. Data is not copied to ArcGIS Server through this tool. ''' CachingScheme/Metadata/thumbnail/iteminfo can't be defined through this tool. ''' CachingScheme can be done through Caching geoprocessing tools. REST Metadata/thumbnail/iteminfo are not available through this app but can be developed using a similar approach to server admin endpoint ''' The sample uses Raster API to populate dataset properties (used to construct service configuration), and can eitehr directly invoke rest Admin API to create service; or using AGSClient to create service. ''' 2. Case sensitivity: ''' (1) switches are case sensitive. ''' (2) when publish a service, the service name is case sensitive ''' 3. Usage: ''' Run from command line environment. Usage. <>: required parameter; |: pick one. ''' isconfig -o publish -h <host_adminurl> -d <datapath> -n <serviceName> ''' isconfig -o <delete|start|stop|pause> -h <host> -n <serviceName> ''' isconfig -o <list> -h <host> ''' Example 1: isconfig -o publish -h "http://host:6080/arcgis/admin" -u "adminuser" -p "adminpassword" -d \\myserver\data\test.gdb\mdtest -n mdtest ''' Example 2: isconfig -o stop -h myservername -u "adminuser" -p "adminpassword" -n mdtest ''' Example 3: isconfig -o list -h myservername -u "adminuser" -p "adminpassword" ''' </summary> Class ISConfig #Region "static variables" Private Shared sourcePath As String = "" 'data source path: a raster dataset, a mosaic dataset Private Shared restAdmin As String = "" 'host admin url e.g. http://host:6080/arcgis/admin Private Shared serviceName As String = "" 'image service name Private Shared rasterDataset As IRasterDataset = Nothing Private Shared soAdmin As IServerObjectAdmin = Nothing Private Shared username As String = "" 'user name for publisher/admin Private Shared password As String = "" 'password for publisher/admin #End Region <STAThread> _ Public Shared Sub Main(args As String()) Try 'args = {"-o", "publish", "-h", "http://server:6080/arcgis/admin", "-u", "adminuser", "-p", "adminpassword", "-d", "\\server\test\rgb.tif", "-n", "mdtest12356"} 'args = {"-o", "list", "-h", "http://server:6080/arcgis/admin", "-u", "adminuser", "-p", "adminpassword"} 'validation If Not ValidateParams(args) Then Return End If 'license If Not InitLicense() Then Return End If 'retrieve parameters Retrieve_Params(args) Dim operation As String = args(1) Select Case operation.ToLower() Case "publish" 'CreateISConfig(); CreateISConfig_RESTAdmin() Exit Select Case "delete" 'DeleteService(); DeleteService_RESTAdmin() Exit Select Case "start" 'StartService(); StartService_RESTAdmin() Exit Select Case "stop" 'StopService(); StopService_RESTAdmin() Exit Select Case "pause" PauseService() Exit Select Case "list" 'ListServices(); ListServices_RESTAdmin() Exit Select End Select Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub #Region "management operations" ''' <summary> ''' create image service configuration ''' </summary> Private Shared Sub CreateISConfig() Try If Not ConnectAGS(restAdmin) Then Return End If 'get source type Dim sourceType As esriImageServiceSourceType = GetSourceType(sourcePath) 'connect to ArcGIS Server and create configuration Dim soConfig As IServerObjectConfiguration5 = DirectCast(soAdmin.CreateConfiguration(), IServerObjectConfiguration5) 'set general service parameters soConfig.Name = serviceName soConfig.TypeName = "ImageServer" soConfig.TargetCluster = "default" soConfig.StartupType = esriStartupType.esriSTAutomatic soConfig.IsPooled = True soConfig.IsolationLevel = esriServerIsolationLevel.esriServerIsolationHigh soConfig.MinInstances = 1 soConfig.MaxInstances = 2 'customize recycle properties Dim propertySet_Recycle As IPropertySet = soConfig.RecycleProperties propertySet_Recycle.SetProperty("Interval", "24") 'path to the data Dim propertySet As IPropertySet = soConfig.Properties Dim workspace As IWorkspace = DirectCast(rasterDataset, IDataset).Workspace If workspace.WorkspaceFactory.WorkspaceType = esriWorkspaceType.esriRemoteDatabaseWorkspace Then Dim wsName2 As IWorkspaceName2 = TryCast(DirectCast(workspace, IDataset).FullName, IWorkspaceName2) Dim connString As String = wsName2.ConnectionString propertySet.SetProperty("ConnectionString", connString) propertySet.SetProperty("Raster", DirectCast(rasterDataset, IDataset).Name) Else propertySet.SetProperty("Path", sourcePath) End If propertySet.SetProperty("EsriImageServiceSourceType", sourceType.ToString()) 'MIME+URL (virtual directory) propertySet.SetProperty("SupportedImageReturnTypes", "MIME+URL") Dim dirs As IEnumServerDirectory = soAdmin.GetServerDirectories() dirs.Reset() Dim serverDir As IServerDirectory = dirs.[Next]() While serverDir IsNot Nothing If DirectCast(serverDir, IServerDirectory2).Type = esriServerDirectoryType.esriSDTypeOutput Then propertySet.SetProperty("OutputDir", serverDir.Path) propertySet.SetProperty("VirtualOutputDir", serverDir.URL) Exit While End If serverDir = dirs.[Next]() End While 'copy right propertySet.SetProperty("CopyRight", "") 'properties for a mosaic dataset; If sourceType = esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset Then Dim functionRasterDataset As IFunctionRasterDataset = DirectCast(rasterDataset, IFunctionRasterDataset) Dim propDefaults As IPropertySet = functionRasterDataset.Properties Dim names As Object, values As Object propDefaults.GetAllProperties(names, values) Dim propNames As New List(Of String)() propNames.AddRange(DirectCast(names, String())) If propNames.Contains("MaxImageHeight") Then propertySet.SetProperty("MaxImageHeight", propDefaults.GetProperty("MaxImageHeight")) End If '4100 If propNames.Contains("MaxImageWidth") Then propertySet.SetProperty("MaxImageWidth", propDefaults.GetProperty("MaxImageWidth")) End If '15000 If propNames.Contains("AllowedCompressions") Then propertySet.SetProperty("AllowedCompressions", propDefaults.GetProperty("AllowedCompressions")) End If '"None,JPEG,LZ77,LERC" If propNames.Contains("DefaultResamplingMethod") Then propertySet.SetProperty("DefaultResamplingMethod", propDefaults.GetProperty("DefaultResamplingMethod")) End If '0 If propNames.Contains("DefaultCompressionQuality") Then propertySet.SetProperty("DefaultCompressionQuality", propDefaults.GetProperty("DefaultCompressionQuality")) End If '75 If propNames.Contains("MaxRecordCount") Then propertySet.SetProperty("MaxRecordCount", propDefaults.GetProperty("MaxRecordCount")) End If '500 If propNames.Contains("MaxMosaicImageCount") Then propertySet.SetProperty("MaxMosaicImageCount", propDefaults.GetProperty("MaxMosaicImageCount")) End If '20 If propNames.Contains("MaxDownloadSizeLimit") Then propertySet.SetProperty("MaxDownloadSizeLimit", propDefaults.GetProperty("MaxDownloadSizeLimit")) End If '20 If propNames.Contains("MaxDownloadImageCount") Then propertySet.SetProperty("MaxDownloadImageCount", propDefaults.GetProperty("MaxDownloadImageCount")) End If '20 If propNames.Contains("AllowedFields") Then propertySet.SetProperty("AllowedFields", propDefaults.GetProperty("AllowedFields")) End If '"Name,MinPS,MaxPS,LowPS,HighPS,CenterX,CenterY" If propNames.Contains("AllowedMosaicMethods") Then propertySet.SetProperty("AllowedMosaicMethods", propDefaults.GetProperty("AllowedMosaicMethods")) End If '"Center,NorthWest,LockRaster,ByAttribute,Nadir,Viewpoint,Seamline" If propNames.Contains("AllowedItemMetadata") Then propertySet.SetProperty("AllowedItemMetadata", propDefaults.GetProperty("AllowedItemMetadata")) End If '"Full" If propNames.Contains("AllowedMensurationCapabilities") Then propertySet.SetProperty("AllowedMensurationCapabilities", propDefaults.GetProperty("AllowedMensurationCapabilities")) End If '"Full" If propNames.Contains("DefaultCompressionTolerance") Then propertySet.SetProperty("DefaultCompressionTolerance", propDefaults.GetProperty("DefaultCompressionTolerance")) '"0.01" LERC compression 'propertySet.SetProperty("RasterFunctions", @"\\server\dir\rft1.rft.xml,\\server\dir\rft2.rft.xml");//"put raster function templates here, the first one is applied to exportimage request by default" 'propertySet.SetProperty("RasterTypes", @"Raster Dataset,\\server\dir\art1.art.xml,\\server\dir\art2.art");//"put raster types here" 'propertySet.SetProperty("DynamicImageWorkspace", @"\\server\dynamicImageDir"); //put the workspace that holds uploaded imagery here 'propertySet.SetProperty("supportsOwnershipBasedAccessControl", true); //ownership based access control 'propertySet.SetProperty("AllowOthersToUpdate", true); //allow others to update a catalog item 'propertySet.SetProperty("AllowOthersToDelete", true); //allow others to delete a catalog item 'propertySet.SetProperty("DownloadDir", ""); //put the download directory here 'propertySet.SetProperty("VirutalDownloadDir", ""); //put the virtual download directory here End If Else propertySet.SetProperty("MaxImageHeight", 4100) propertySet.SetProperty("MaxImageWidth", 15000) propertySet.SetProperty("AllowedCompressions", "None,JPEG,LZ77") propertySet.SetProperty("DefaultResamplingMethod", 0) propertySet.SetProperty("DefaultCompressionQuality", 75) 'for jpg compression propertySet.SetProperty("DefaultCompressionTolerance", 0.01) 'for LERC compression ' rasterDataset = OpenRasterDataset(sourcePath); Dim measure As IMensuration = New MensurationClass() measure.Raster = DirectCast(rasterDataset, IRasterDataset2).CreateFullRaster() Dim mensurationCaps As String = "" If measure.CanMeasure Then mensurationCaps = "Basic" End If If measure.CanMeasureHeightBaseToTop Then mensurationCaps += ",Base-Top Height" End If If measure.CanMeasureHeightBaseToTopShadow Then mensurationCaps += ",Base-Top Shadow Height" End If If measure.CanMeasureHeightTopToTopShadow Then mensurationCaps += ",Top-Top Shadow Height" End If 'set mensuration here propertySet.SetProperty("AllowedMensurationCapabilities", mensurationCaps) End If 'not cached propertySet.SetProperty("IsCached", False) propertySet.SetProperty("IgnoreCache", True) propertySet.SetProperty("UseLocalCacheDir", False) propertySet.SetProperty("ClientCachingAllowed", False) 'propertySet.SetProperty("DEM", ""); //put the elevation raster dataset or service for 3D mensuration, may need to add 3D to AllowedMensurationCapabilities 'convert colormap to RGB or not propertySet.SetProperty("ColormapToRGB", False) 'whether to return jpgs for all jpgpng request or not propertySet.SetProperty("ReturnJPGPNGAsJPG", False) 'allow server to process client defined function propertySet.SetProperty("AllowFunction", True) 'allow raster function 'capabilities If sourceType = esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset Then soConfig.Info.SetProperty("Capabilities", "Image,Catalog,Metadata,Mensuration") Else 'Full set: Image,Catalog,Metadata,Download,Pixels,Edit,Mensuration soConfig.Info.SetProperty("Capabilities", "Image,Metadata,Mensuration") End If 'enable wcs, assume data has spatial reference soConfig.set_ExtensionEnabled("WCSServer", True) Dim wcsInfo As IPropertySet = New PropertySetClass() wcsInfo.SetProperty("WebEnabled", "true") soConfig.set_ExtensionInfo("WCSServer", wcsInfo) Dim propertySetWCS As IPropertySet = New PropertySetClass() propertySetWCS.SetProperty("CustomGetCapabilities", False) propertySetWCS.SetProperty("PathToCustomGetCapabilitiesFiles", "") soConfig.set_ExtensionProperties("WCSServer", propertySetWCS) 'enable wms soConfig.set_ExtensionEnabled("WMSServer", True) Dim wmsInfo As IPropertySet = New PropertySetClass() wmsInfo.SetProperty("WebEnabled", "true") soConfig.set_ExtensionInfo("WMSServer", wmsInfo) Dim propertySetWMS As IPropertySet = New PropertySetClass() propertySetWMS.SetProperty("name", "WMS") 'set other properties here soConfig.set_ExtensionProperties("WMSServer", propertySetWMS) 'add configuration and start soAdmin.AddConfiguration(soConfig) soAdmin.StartConfiguration(serviceName, "ImageServer") If soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status = esriConfigurationStatus.esriCSStarted Then Console.WriteLine("{0} on {1} has been configured and started.", serviceName, restAdmin) Else Console.WriteLine("{0} on {1} was configured but can not be started, please investigate.", serviceName, restAdmin) End If If rasterDataset IsNot Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterDataset) End If Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub ''' <summary> ''' delete a service ''' </summary> Private Shared Sub DeleteService() Try If Not ConnectAGS(restAdmin) Then Return End If If Not ValidateServiceName(soAdmin, serviceName, restAdmin) Then Return End If soAdmin.DeleteConfiguration(serviceName, "ImageServer") Console.WriteLine("{0} on {1} was deleted successfully.", serviceName, restAdmin) Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub ''' <summary> ''' start a service ''' </summary> Private Shared Sub StartService() Try If Not ConnectAGS(restAdmin) Then Return End If If Not ValidateServiceName(soAdmin, serviceName, restAdmin) Then Return End If soAdmin.StartConfiguration(serviceName, "ImageServer") If soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status = esriConfigurationStatus.esriCSStarted Then Console.WriteLine("{0} on {1} was started successfully.", serviceName, restAdmin) Else Console.WriteLine("{0} on {1} couldn't be started, please investigate.", serviceName, restAdmin) End If Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub ''' <summary> ''' stop a service ''' </summary> Private Shared Sub StopService() Try If Not ConnectAGS(restAdmin) Then Return End If If Not ValidateServiceName(soAdmin, serviceName, restAdmin) Then Return End If soAdmin.StopConfiguration(serviceName, "ImageServer") If soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status = esriConfigurationStatus.esriCSStopped Then Console.WriteLine("{0} on {1} was stopped successfully.", serviceName, restAdmin) Else Console.WriteLine("{0} on {1} couldn't be stopped, please investigate.", serviceName, restAdmin) End If Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub ''' <summary> ''' pause a service ''' </summary> Private Shared Sub PauseService() Try If Not ConnectAGS(restAdmin) Then Return End If If Not ValidateServiceName(soAdmin, serviceName, restAdmin) Then Return End If If (soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status = esriConfigurationStatus.esriCSStopped) Then Console.WriteLine("{0} on {1} is currently stopped --- not paused.", serviceName, restAdmin) Return End If soAdmin.PauseConfiguration(serviceName, "ImageServer") If soAdmin.GetConfigurationStatus(serviceName, "ImageServer").Status = esriConfigurationStatus.esriCSPaused Then Console.WriteLine("{0} on {1} was paused successfully.", serviceName, restAdmin) Else Console.WriteLine("{0} on {1} couldn't be paused, please investigate.", serviceName, restAdmin) End If Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub ''' <summary> ''' List services ''' </summary> Private Shared Sub ListServices() Try If Not ConnectAGS(restAdmin) Then Return End If Dim enumConfigs As IEnumServerObjectConfiguration = soAdmin.GetConfigurations() enumConfigs.Reset() Dim soConfig As IServerObjectConfiguration = enumConfigs.[Next]() Console.WriteLine("ArcGIS Server {0} has the following image services:", restAdmin) While soConfig IsNot Nothing If soConfig.TypeName = "ImageServer" Then Console.WriteLine("{0}", soConfig.Name) End If soConfig = enumConfigs.[Next]() End While Catch exc As Exception Console.WriteLine("Error: {0}", exc.Message) End Try End Sub #End Region #Region "validation etc." ''' <summary> ''' connect to ags server ''' </summary> ''' <param name="host">host</param> ''' <returns>true if connected</returns> Private Shared Function ConnectAGS(host As String) As Boolean Try Dim propertySet As IPropertySet = New PropertySetClass() propertySet.SetProperty("url", host) propertySet.SetProperty("ConnectionMode", esriAGSConnectionMode.esriAGSConnectionModePublisher) propertySet.SetProperty("ServerType", esriAGSServerType.esriAGSServerTypeDiscovery) propertySet.SetProperty("user", username) propertySet.SetProperty("password", password) propertySet.SetProperty("ALLOWINSECURETOKENURL", True) Dim connectName As IAGSServerConnectionName3 = TryCast(New AGSServerConnectionNameClass(), IAGSServerConnectionName3) connectName.ConnectionProperties = propertySet Dim agsAdmin As IAGSServerConnectionAdmin = TryCast(DirectCast(connectName, IName).Open(), IAGSServerConnectionAdmin) soAdmin = agsAdmin.ServerObjectAdmin Return True Catch exc As Exception Console.WriteLine("Error: Couldn't connect to AGSServer: {0}. Message: {1}", host, exc.Message) Return False End Try End Function ''' <summary> ''' Validate ServiceName ''' </summary> ''' <returns>Convert the config name to the correct case and returns true; if not exist in any cases, returns false </returns> Private Shared Function ValidateServiceName(soAdmin As IServerObjectAdmin, ByRef serviceName As String, host As String) As Boolean Dim enumConfigs As IEnumServerObjectConfiguration = soAdmin.GetConfigurations() enumConfigs.Reset() Dim soConfig As IServerObjectConfiguration = enumConfigs.[Next]() While soConfig IsNot Nothing If soConfig.Name.ToUpper() = serviceName.ToUpper() Then serviceName = soConfig.Name Return True End If soConfig = enumConfigs.[Next]() End While Console.WriteLine("Configuration {0} on {1} can not be found.", serviceName, host) Return False End Function ''' <summary> ''' Validate input parameters ''' </summary> ''' <param name="args">args</param> ''' <returns>validation result</returns> Private Shared Function ValidateParams(args As String()) As Boolean 'at least two params If args.Length = 0 Then ShowUsage() Console.WriteLine("press any key to continue ...") Console.ReadKey() Return False ElseIf args.Length < 2 Then ' at least -o action ShowUsage() Return False End If ' must start with -o Dim operations As String() = New String() {"publish", "delete", "start", "stop", "pause", "list"} If (Not args(0).StartsWith("-o")) OrElse (Not strInArray(args(1).ToLower(), operations)) Then Console.WriteLine("Incorrect operation") ShowUsage() Return False End If ' for stop/start/pause/list, must contains "-n" and argument length is 4 If (args(1).ToLower() = "stop") OrElse (args(1).ToLower() = "start") OrElse (args(1).ToLower() = "pause") OrElse (args(1).ToLower() = "delete") Then If Not strInArray("-h", args) Then Console.WriteLine("Missing host server -h") Return False End If If Not strInArray("-n", args) Then Console.WriteLine("Missing service name switch -n") Return False End If If Not strInArray("-u", args) Then Console.WriteLine("Missing admin/publisher username switch -u") Return False End If If Not strInArray("-p", args) Then Console.WriteLine("Missing admin/publisher name switch -p") Return False 'if (args.Length > 8) '{ ' Console.WriteLine("Too many arguments"); ' return false; '} End If End If ' for publish, must contains "-d" "-n" and argument length is 6 If args(1).ToLower() = "publish" Then If Not strInArray("-d", args) Then Console.WriteLine("Missing data source switch -d") Return False End If If Not strInArray("-n", args) Then Console.WriteLine("Missing service name switch -n") Return False End If If Not strInArray("-u", args) Then Console.WriteLine("Missing admin/publisher username switch -u") Return False End If If Not strInArray("-p", args) Then Console.WriteLine("Missing admin/publisher name switch -p") Return False 'if (args.Length > 12) '{ ' Console.WriteLine("Too many arguments"); ' return false; '} End If End If ' validate each parameter: host, sourcepath, configname Dim parameters As String() = New String() {"-h", "-d", "-n", "-u", "-p"} For i As Integer = 2 To args.Length - 1 Select Case args(i) Case "-h" If i = args.Length - 1 Then Console.WriteLine("Missing host parameter, switch -h") Return False ElseIf strInArray(args(i + 1), parameters) Then Console.WriteLine("Missing host parameter, switch -h") Return False End If i += 1 Exit Select Case "-d" If i = args.Length - 1 Then Console.WriteLine("Missing data source parameter, switch -d") Return False ElseIf strInArray(args(i + 1), parameters) Then Console.WriteLine("Missing data source parameter, switch -d") Return False End If i += 1 Exit Select Case "-n" If i = args.Length - 1 Then Console.WriteLine("Missing service name parameter, switch -n") Return False ElseIf strInArray(args(i + 1), parameters) Then Console.WriteLine("Missing service name parameter, switch -n") Return False End If i += 1 Exit Select Case "-u" If i = args.Length - 1 Then Console.WriteLine("Missing admin/publisher username parameter, switch -u") Return False ElseIf strInArray(args(i + 1), parameters) Then Console.WriteLine("Missing admin/publisher username parameter, switch -u") Return False End If i += 1 Exit Select Case "-p" If i = args.Length - 1 Then Console.WriteLine("Missing admin/publisher password parameter, switch -p") Return False ElseIf strInArray(args(i + 1), parameters) Then Console.WriteLine("Missing admin/publisher password parameter, switch -p") Return False End If i += 1 Exit Select Case Else Console.WriteLine("Incorrect parameter switch: {0} is not a recognized.", args(i)) Return False End Select Next Return True End Function ''' <summary> ''' string in array ''' </summary> ''' <param name="name"></param> ''' <param name="nameArray"></param> ''' <returns></returns> Private Shared Function strInArray(name As String, nameArray As String()) As Boolean For i As Integer = 0 To nameArray.Length - 1 If nameArray(i) = name Then Return True End If Next Return False End Function ''' <summary> ''' initialize license ''' </summary> ''' <returns>status</returns> Private Shared Function InitLicense() As Boolean RuntimeManager.Bind(ProductCode.Desktop) Dim aoInit As IAoInitialize = New AoInitializeClass() Dim status As esriLicenseStatus = aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeBasic) If status <> esriLicenseStatus.esriLicenseCheckedOut Then Console.WriteLine("License initialization error") Return False Else Return True End If End Function #End Region #Region "helper methods" ''' <summary> ''' Retrieve parameters ''' </summary> ''' <param name="args">args</param> Private Shared Sub Retrieve_Params(args As String()) For i As Integer = 2 To args.Length - 1 Select Case args(i) Case "-h" restAdmin = args(System.Threading.Interlocked.Increment(i)) Exit Select Case "-d" sourcePath = args(System.Threading.Interlocked.Increment(i)) Exit Select Case "-n" serviceName = args(System.Threading.Interlocked.Increment(i)) Exit Select Case "-u" username = args(System.Threading.Interlocked.Increment(i)) Exit Select Case "-p" password = args(System.Threading.Interlocked.Increment(i)) Exit Select End Select Next End Sub ''' <summary> ''' Get Source Type ''' </summary> ''' <param name="sourcePath">path of the data source</param> ''' <returns>data source type</returns> Private Shared Function GetSourceType(sourcePath As String) As esriImageServiceSourceType If sourcePath.ToLower().EndsWith(".lyr") Then Return esriImageServiceSourceType.esriImageServiceSourceTypeLayer Else Dim fileInfo As New FileInfo(sourcePath) OpenRasterDataset(fileInfo.DirectoryName, fileInfo.Name) If TypeOf rasterDataset Is IMosaicDataset Then Return esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset Else Return esriImageServiceSourceType.esriImageServiceSourceTypeDataset End If End If End Function ''' <summary> ''' Open Raster Dataset ''' </summary> ''' <param name="path">path of the dataset</param> ''' <param name="rasterDSName">name of the dataset</param> Private Shared Sub OpenRasterDataset(path As [String], rasterDSName As [String]) 'this is why the utility user needs access to data source. image service configurations varies among data sources. Dim workspaceFactory As IWorkspaceFactory = Nothing Dim workspace As IWorkspace = Nothing Dim rasterWorkspaceEx As IRasterWorkspaceEx = Nothing Dim factoryType As Type = Nothing Try Select Case path.Substring(path.Length - 4, 4).ToLower() ' a path can never be shorter than 4 characters, isn't it? c:\a Case ".gdb" factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory") workspaceFactory = TryCast(Activator.CreateInstance(factoryType), IWorkspaceFactory) workspace = workspaceFactory.OpenFromFile(path, 1) rasterWorkspaceEx = DirectCast(workspace, IRasterWorkspaceEx) rasterDataset = rasterWorkspaceEx.OpenRasterDataset(rasterDSName) Exit Select Case ".sde" factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SdeWorkspaceFactory") workspaceFactory = TryCast(Activator.CreateInstance(factoryType), IWorkspaceFactory) workspace = workspaceFactory.OpenFromFile(path, 1) rasterWorkspaceEx = DirectCast(workspace, IRasterWorkspaceEx) rasterDataset = rasterWorkspaceEx.OpenRasterDataset(rasterDSName) Exit Select Case Else factoryType = Type.GetTypeFromProgID("esriDataSourcesRaster.RasterWorkspaceFactory") workspaceFactory = TryCast(Activator.CreateInstance(factoryType), IWorkspaceFactory) workspace = workspaceFactory.OpenFromFile(path, 1) Dim rasterWorkspace As IRasterWorkspace = DirectCast(workspace, IRasterWorkspace) rasterDataset = rasterWorkspace.OpenRasterDataset(rasterDSName) Exit Select End Select Catch generatedExceptionName As Exception Throw New ArgumentException("Failed to open source data") End Try End Sub ''' <summary> ''' Show usage ''' </summary> Private Shared Sub ShowUsage() Console.WriteLine() Console.WriteLine("ArcObject Sample: command line image service publishing and configuration utility (10.1 ArcGIS Server). Data is not copied to server using this tool. source data must be accessible by ArcGIS Server running account. CachingScheme can't be defined through this tool but can be done through Caching geoprocessing tools. REST Metadata/thumbnail/iteminfo resource are not available through this app but can be developed using a similar approach to server admin endpoint.") Console.WriteLine() Console.WriteLine("Usage. <>: required parameter; |: pick one.") Console.WriteLine("isconfig -o publish -h <host_admin_url> -u <adminuser> -p <adminpassword> -d <datapath> -n <serviceName>") Console.WriteLine("isconfig -o <delete|start|stop> -h <host_admin_url> -u <adminuser> -p <adminpassword> -n <serviceName>") Console.WriteLine("isconfig -o <list> -h <host_admin_url> -u <adminuser> -p <adminpassword>") Console.WriteLine("e.g. isconfig -o list -h http://myserver:6080/arcgis/admin -u username -p password") End Sub #End Region #Region "REST Admin based http requests" ''' <summary> ''' Generate a token ''' </summary> ''' <param name="restAdmin">REST admin url: http://server:port/arcigs/admin</param> ''' <returns>A token that has default expiration time</returns> Public Shared Function GenerateAGSToken_RESTAdmin() As String Try Dim loginUrl As String = restAdmin & "/generateToken" Dim request As WebRequest = WebRequest.Create(loginUrl) request.Method = "POST" Dim credential As String = "username=" & username & "&password=" & password & "&client=requestip&expiration=&f=json" Dim content As Byte() = Encoding.UTF8.GetBytes(credential) request.ContentLength = content.Length request.ContentType = "application/x-www-form-urlencoded" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Dim index1 As Integer = result.IndexOf("token"":""") + "token"":""".Length Dim index2 As Integer = result.IndexOf("""", index1) 'Dictionary<string, object> dictResult = DeserializeJSON(result, true); Dim token As String = result.Substring(index1, index2 - index1) Return token Catch Return "" End Try End Function ''' <summary> ''' Create arcgis server folder ''' </summary> ''' <param name="restAdmin">REST admin url, e.g. http://server:port/arcgis/admin</param> ''' <param name="folderName">Folder name</param> ''' <param name="description">Description of the folder</param> ''' <returns>True if successfully created</returns> Private Shared Function CreateServerFolder_RESTAdmin(folderName As String, description As String) As Boolean Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim folderUrl As String = restAdmin & "/services/" & folderName & "?f=json&token=" & token Dim request As WebRequest = WebRequest.Create(folderUrl) Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() If Not result.Contains("error") Then Return True Else Dim createFolderUrl As String = restAdmin & "/services/createFolder" request = WebRequest.Create(createFolderUrl) Dim postcontent As String = String.Format("folderName={0}&description={1}&f=pjson&token={2}", folderName, description, token) Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length '((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() response = request.GetResponse() responseStream = response.GetResponseStream() reader = New StreamReader(responseStream) result = reader.ReadToEnd() Return result.Contains("success") End If Catch Return False End Try End Function Private Shared Sub GetServerDirectory_RESTAdmin(dirType As String, ByRef physicalPath As String, ByRef virtualPath As String) physicalPath = "" virtualPath = "" Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim directoryAlias As String = dirType.ToString().ToLower().Replace("esrisdtype", "arcgis") Dim directoryUrl As String = restAdmin & "/system/directories/" & directoryAlias & "?f=json&token=" & token Dim request As WebRequest = WebRequest.Create(directoryUrl) Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Try Dim index As Integer = result.IndexOf(dirType) Dim index1 As Integer = result.IndexOf("physicalPath"":""", index) + "physicalPath"":""".Length Dim index2 As Integer = result.IndexOf("""", index1) physicalPath = result.Substring(index1, index2 - index1) index1 = result.IndexOf("virtualPath"":""", index) + "virtualPath"":""".Length index2 = result.IndexOf("""", index1) virtualPath = result.Substring(index1, index2 - index1) Catch End Try Catch End Try End Sub ''' <summary> ''' Delete Service ''' </summary> ''' <param name="restAdmin">REST admin url, e.g. http://server:port/arcgis/admin</param> ''' <param name="serviceName">Service Name</param> ''' <param name="serviceType">Server Type, e.g. ImageServer, MapServer, GeoDataServer, GeoprocessingServer, GeometryServer, etc</param> ''' <returns>True if successfully deleted</returns> Public Shared Function DeleteService_RESTAdmin() As Boolean Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim serviceUrl As String = restAdmin & "/services/" & serviceName & "." & "ImageServer" & "/delete" Dim request As WebRequest = WebRequest.Create(serviceUrl) Dim postcontent As String = "f=pjson&token=" & token Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length '((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Console.WriteLine("delete service {0}, result: {1}", serviceName, result) Return result.Contains("success") Catch Return False End Try End Function Public Shared Function StartService_RESTAdmin() As Boolean Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim serviceUrl As String = restAdmin & "/services/" & serviceName & "." & "ImageServer" & "/start" Dim request As WebRequest = WebRequest.Create(serviceUrl) Dim postcontent As String = "f=pjson&token=" & token Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length '((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Console.WriteLine("start service {0}, result: {1}", serviceName, result) Return result.Contains("success") Catch Return False End Try End Function Public Shared Function StopService_RESTAdmin() As Boolean Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim serviceUrl As String = restAdmin & "/services/" & serviceName & "." & "ImageServer" & "/stop" Dim request As WebRequest = WebRequest.Create(serviceUrl) Dim postcontent As String = "f=pjson&token=" & token Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length '((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Console.WriteLine("stop service {0}, result: {1}", serviceName, result) Return result.Contains("success") Catch Return False End Try End Function Public Shared Sub ListServices_RESTAdmin() Console.WriteLine("List of image services: ") ListServices_RESTAdmin(restAdmin & "/services", "") End Sub Public Shared Sub ListServices_RESTAdmin(root As String, folder As String) Try Dim token As String = GenerateAGSToken_RESTAdmin() restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim serviceUrl As String = root & "/" & folder Dim request As WebRequest = WebRequest.Create(serviceUrl) Dim postcontent As String = "f=json&token=" & token Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length '((HttpWebRequest)request).UserAgent = "Mozilla/4.0"; request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Dim indexfolder1 As Integer = result.IndexOf("folders"":[") If indexfolder1 <> -1 Then indexfolder1 += "folders"":[".Length Dim indexfolder2 As Integer = result.IndexOf("]", indexfolder1) Dim folderlist As String = result.Substring(indexfolder1, indexfolder2 - indexfolder1) Dim folders As String() = folderlist.Replace("""", "").Split(","C) For Each subfolder As String In folders ListServices_RESTAdmin(serviceUrl, subfolder) Next End If Dim index As Integer = result.IndexOf("services") While index > 0 Try Dim index1 As Integer = result.IndexOf("folderName"":""", index) If index1 = -1 Then Exit While End If index1 += "folderName"":""".Length Dim index2 As Integer = result.IndexOf("""", index1) Dim folderName As String = result.Substring(index1, index2 - index1) index1 = result.IndexOf("serviceName"":""", index2) + "serviceName"":""".Length index2 = result.IndexOf("""", index1) Dim serviceName As String = result.Substring(index1, index2 - index1) index1 = result.IndexOf("type"":""", index2) + "type"":""".Length index2 = result.IndexOf("""", index1) Dim serviceType As String = result.Substring(index1, index2 - index1) If serviceType = "ImageServer" Then If folderName = "/" Then 'root Console.WriteLine(serviceName) Else Console.WriteLine(folderName & "/" & serviceName) End If End If index = index2 Catch End Try End While Catch End Try End Sub ''' <summary> ''' create image service ''' </summary> ''' <param name="restAdmin">host machine name (windows or linux)</param> ''' <param name="sourcePath">data source path, must be windows path (linux path is constructed automaticlly by windows path)</param> ''' <param name="serviceName">configuration name</param> ''' <param name="createImageServiceParams">Cration parameters, e.g. raster functions, colormaptorgb, raster types, dem, dynamicimageworkspace, customized propertyset etc</param> ''' <returns>true if created successfully</returns> Public Shared Function CreateISConfig_RESTAdmin() As Boolean 'string restAdmin, string username, string password, string sourcePath, string serviceName Try Dim sourceType As esriImageServiceSourceType = GetSourceType(sourcePath) Dim serviceType As String = "ImageServer" 'DeleteService_RESTAdmin(); restAdmin = If(restAdmin.EndsWith("/"), restAdmin.Substring(0, restAdmin.Length - 1), restAdmin) Dim serviceFolder As String = "" If serviceName.Contains("/") Then serviceFolder = serviceName.Substring(0, serviceName.IndexOf("/")) CreateServerFolder_RESTAdmin(serviceFolder, "") serviceName = serviceName.Substring(serviceFolder.Length + 1, serviceName.Length - serviceFolder.Length - 1) End If Dim createServiceUrl As String = "" If serviceFolder = "" Then createServiceUrl = restAdmin & "/services/createService" Else createServiceUrl = restAdmin & "/services/" & serviceFolder & "/createService" End If 'createServiceUrl = "http://wenxue:6080/arcgis/admin/services/createService"; Dim request As WebRequest = WebRequest.Create(createServiceUrl) 'DataSourceIsReadOnly Dim sBuilder As New StringBuilder() sBuilder.Append("{") sBuilder.AppendFormat("{0}: {1},", QuoteString("serviceName"), QuoteString(serviceName)) sBuilder.AppendFormat("{0}: {1},", QuoteString("type"), QuoteString(serviceType)) sBuilder.AppendFormat("{0}: {1},", QuoteString("description"), QuoteString("")) sBuilder.AppendFormat("{0}: {1},", QuoteString("clusterName"), QuoteString("default")) sBuilder.AppendFormat("{0}: {1},", QuoteString("minInstancesPerNode"), 1) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxInstancesPerNode"), 2) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxWaitTime"), 10000) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxIdleTime"), 1800) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxUsageTime"), 600) sBuilder.AppendFormat("{0}: {1},", QuoteString("loadBalancing"), QuoteString("ROUND_ROBIN")) sBuilder.AppendFormat("{0}: {1},", QuoteString("isolationLevel"), QuoteString("HIGH")) sBuilder.AppendFormat("{0}: {1},", QuoteString("configuredState"), QuoteString("STARTED")) Dim webCapabilities As String = "" If sourceType = esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset Then webCapabilities = "Image,Catalog,Metadata,Mensuration" Else 'full list "Image,Catalog,Metadata,Download,Pixels,Edit,Mensuration" webCapabilities = "Image,Metadata,Mensuration" End If sBuilder.AppendFormat("{0}: {1},", QuoteString("capabilities"), QuoteString(webCapabilities)) sBuilder.AppendFormat("{0}: {1}", QuoteString("properties"), "{") sBuilder.AppendFormat("{0}: {1},", QuoteString("supportedImageReturnTypes"), QuoteString("MIME+URL")) Dim workspace As IWorkspace = DirectCast(rasterDataset, IDataset).Workspace If workspace.WorkspaceFactory.WorkspaceType = esriWorkspaceType.esriRemoteDatabaseWorkspace Then Dim wsName2 As IWorkspaceName2 = TryCast(DirectCast(workspace, IDataset).FullName, IWorkspaceName2) Dim connString As String = wsName2.ConnectionString sBuilder.AppendFormat("{0}: {1},", QuoteString("connectionString"), QuoteString(connString)) sBuilder.AppendFormat("{0}: {1},", QuoteString("raster"), QuoteString(DirectCast(rasterDataset, IDataset).Name)) Else sBuilder.AppendFormat("{0}: {1},", QuoteString("path"), QuoteString(sourcePath.Replace("\", "\\"))) End If sBuilder.AppendFormat("{0}: {1},", QuoteString("esriImageServiceSourceType"), QuoteString(sourceType.ToString())) Dim outputDir As String = "" Dim virtualDir As String = "" GetServerDirectory_RESTAdmin("arcgisoutput", outputDir, virtualDir) Dim cacheDir As String = "" Dim virtualCacheDir As String = "" GetServerDirectory_RESTAdmin("arcgisoutput", cacheDir, virtualCacheDir) If outputDir <> "" Then sBuilder.AppendFormat("{0}: {1},", QuoteString("outputDir"), QuoteString(outputDir)) 'http://istest2:6080/arcgis/server/arcgisoutput")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("dynamicImageWorkspace"), QuoteString(@"D:\UploadDir")); sBuilder.AppendFormat("{0}: {1},", QuoteString("virtualOutputDir"), QuoteString(virtualDir)) End If 'if (cacheDir != "") '{ ' sBuilder.AppendFormat("{0}: {1},", QuoteString("cacheDir"), QuoteString(cacheDir)); ' sBuilder.AppendFormat("{0}: {1},", QuoteString("virtualCacheDir"), QuoteString(virtualCacheDir));//http://istest2:6080/arcgis/server/arcgisoutput")); '} sBuilder.AppendFormat("{0}: {1},", QuoteString("copyright"), QuoteString("")) 'properties for a mosaic Dataset; If sourceType = esriImageServiceSourceType.esriImageServiceSourceTypeMosaicDataset Then Dim functionRasterDataset As IFunctionRasterDataset = DirectCast(rasterDataset, IFunctionRasterDataset) Dim propDefaults As IPropertySet = functionRasterDataset.Properties Dim names As Object, values As Object propDefaults.GetAllProperties(names, values) Dim propNames As New List(Of String)() propNames.AddRange(DirectCast(names, String())) If propNames.Contains("AllowedCompressions") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedCompressions"), QuoteString(propDefaults.GetProperty("AllowedCompressions").ToString())) End If 'string If propNames.Contains("MaxImageHeight") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageHeight"), QuoteString(propDefaults.GetProperty("MaxImageHeight").ToString())) End If 'should be int If propNames.Contains("MaxImageWidth") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageWidth"), QuoteString(propDefaults.GetProperty("MaxImageWidth").ToString())) End If 'should be int If propNames.Contains("DefaultResamplingMethod") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultResamplingMethod"), QuoteString(propDefaults.GetProperty("DefaultResamplingMethod").ToString())) End If 'should be int If propNames.Contains("DefaultCompressionQuality") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionQuality"), QuoteString(propDefaults.GetProperty("DefaultCompressionQuality").ToString())) End If 'should be int If propNames.Contains("MaxRecordCount") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("maxRecordCount"), QuoteString(propDefaults.GetProperty("MaxRecordCount").ToString())) End If 'should be int If propNames.Contains("MaxMosaicImageCount") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("maxMosaicImageCount"), QuoteString(propDefaults.GetProperty("MaxMosaicImageCount").ToString())) End If 'should be int If propNames.Contains("MaxDownloadImageCount") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("maxDownloadImageCount"), QuoteString(propDefaults.GetProperty("MaxDownloadImageCount").ToString())) End If 'should be int If propNames.Contains("MaxDownloadSizeLimit") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("MaxDownloadSizeLimit"), QuoteString(propDefaults.GetProperty("MaxDownloadSizeLimit").ToString())) End If 'should be int If propNames.Contains("AllowedFields") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedFields"), QuoteString(propDefaults.GetProperty("AllowedFields").ToString())) End If 'string If propNames.Contains("AllowedMosaicMethods") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedMosaicMethods"), QuoteString(propDefaults.GetProperty("AllowedMosaicMethods").ToString())) End If 'string If propNames.Contains("AllowedItemMetadata") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedItemMetadata"), QuoteString(propDefaults.GetProperty("AllowedItemMetadata").ToString())) End If 'string If propNames.Contains("AllowedMensurationCapabilities") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("AllowedMensurationCapabilities"), QuoteString(propDefaults.GetProperty("AllowedMensurationCapabilities").ToString())) End If 'string If propNames.Contains("DefaultCompressionTolerance") Then sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionTolerance"), QuoteString(propDefaults.GetProperty("DefaultCompressionTolerance").ToString())) 'string 'sBuilder.AppendFormat("{0}: {1},", QuoteString("downloadDir"), QuoteString(@"c:\temp"));//string 'sBuilder.AppendFormat("{0}: {1},", QuoteString("virutalDownloadDir"), QuoteString(@"http://localhost/temp");//string End If ElseIf sourceType <> esriImageServiceSourceType.esriImageServiceSourceTypeCatalog Then 'not iscdef sBuilder.AppendFormat("{0}: {1},", QuoteString("allowedCompressions"), QuoteString("None,JPEG,LZ77")) sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageHeight"), QuoteString("4100")) 'should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("maxImageWidth"), QuoteString("15000")) 'should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultResamplingMethod"), QuoteString("0")) 'should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionQuality"), QuoteString("75")) 'should be int sBuilder.AppendFormat("{0}: {1},", QuoteString("defaultCompressionTolerance"), QuoteString("0.01")) 'should be int Dim measure As IMensuration = New MensurationClass() measure.Raster = DirectCast(rasterDataset, IRasterDataset2).CreateFullRaster() Dim mensurationCaps As String = "" If measure.CanMeasure Then mensurationCaps = "Basic" End If If measure.CanMeasureHeightBaseToTop Then mensurationCaps += ",Base-Top Height" End If If measure.CanMeasureHeightBaseToTopShadow Then mensurationCaps += ",Base-Top Shadow Height" End If If measure.CanMeasureHeightTopToTopShadow Then mensurationCaps += ",Top-Top Shadow Height" End If 'string sBuilder.AppendFormat("{0}: {1},", QuoteString("AllowedMensurationCapabilities"), QuoteString(mensurationCaps)) End If 'sBuilder.AppendFormat("{0}: {1},", QuoteString("dEM"), QuoteString(@"c:\elevation\elevation.tif")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("supportsOwnershipBasedAccessControl"), QuoteString("true")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("allowOthersToUpdate"), QuoteString("true")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("allowOthersToDelete"), QuoteString("true")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("cacheOnDemand"), QuoteString("false")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("isCached"), QuoteString("false")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("ignoreCache"), QuoteString("true")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("useLocalCacheDir"), QuoteString("false")); 'sBuilder.AppendFormat("{0}: {1},", QuoteString("clientCachingAllowed"), QuoteString("false")); sBuilder.AppendFormat("{0}: {1},", QuoteString("colormapToRGB"), QuoteString("false")) sBuilder.AppendFormat("{0}: {1},", QuoteString("returnJPGPNGAsJPG"), QuoteString("false")) sBuilder.AppendFormat("{0}: {1},", QuoteString("allowFunction"), QuoteString("true")) Dim rasterFunctions As String = "" sBuilder.AppendFormat("{0}: {1},", QuoteString("rasterFunctions"), QuoteString(rasterFunctions).Replace("\", "\\")) Dim rasterTypes As String = "" sBuilder.AppendFormat("{0}: {1}", QuoteString("rasterTypes"), QuoteString(rasterTypes).Replace("\", "\\")) sBuilder.Append("},") Dim enableWCS As Boolean = True Dim enableWMS As Boolean = True sBuilder.AppendFormat("{0}: {1}", QuoteString("extensions"), "[{""typeName"":""WCSServer"",""enabled"":""" & enableWCS & """,""capabilities"":null,""properties"":{}},{""typeName"":""WMSServer"",""enabled"":""" & enableWMS & """,""capabilities"":null,""properties"":{""title"":""WMS"",""name"":""WMS"",""inheritLayerNames"":""false""}}") sBuilder.Append("],") sBuilder.AppendFormat("{0}: {1}", QuoteString("datasets"), "[]") sBuilder.Append("}") Dim postcontent As String = HttpUtility.UrlEncode(sBuilder.ToString()) Dim token As String = GenerateAGSToken_RESTAdmin() postcontent = "service=" & postcontent & "&startAfterCreate=on&f=pjson&token=" & token Dim content As [Byte]() = Encoding.UTF8.GetBytes(postcontent) request.ContentLength = content.Length request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim requestStream As Stream = request.GetRequestStream() requestStream.Write(content, 0, content.Length) requestStream.Close() Dim response As WebResponse = request.GetResponse() Dim responseStream As Stream = response.GetResponseStream() Dim reader As New StreamReader(responseStream) Dim result As String = reader.ReadToEnd() Console.WriteLine("create service:" & serviceName & " result:" & result) 'wait for 5 seconds to reduce latency issue 'System.Threading.Thread.Sleep(5000); Return result.Contains("success") Catch exc As Exception Console.WriteLine(exc.Message) Return False End Try End Function Private Shared Function QuoteString(input As String) As String Return """" & input & """" End Function Private Shared Function DeQuoteString(input As String) As String If input.StartsWith("""") Then Return input.Substring(1, input.Length - 2).Trim() Else Return input End If End Function #End Region End Class