Friday, 3 November 2017

Manage Map Cache using ArcGIS Server 10.4 REST API using C#.net


I am trying to use the ArcGIS Server 10.4 REST API to manage map caches via C#.NET, System.Net.Http. I am able to access and utilize the REST API with this technology, so I know it can work. But this specific attempt fails every time with the following error:


Error executing tool. Manage Map Cache Tiles Job ID: j89eeb39daaba427891dcc5cefe90a0d0 : ERROR 001428: Failed to retrieve configuration for service http://arcgistest.domain.net:6080/arcgis/rest/services/TestServices/TestPoints/MapServer/. Failed to execute (Manage Map Cache Tiles).


As you can see by the error message I am able to submit a job to the proper service (that is after generating a token, which is required for the System geoprocessing services). Furthermore, if I remove one of the required parameters I get a message telling me so. This helps me to know I'm on the right track.


My best guess is the "service_url" parameter is not correct but the documentation on what to supply here is not helpful and mainly for python applications which will be running on a local machine. My goal is to create a service wrapper for a non-gis developer...


private static void TryMapCache(string[] args, string token)
{

args = new string[7];
string url = "http://arcgistest.domain.net:6080/arcgis/rest/services/System/CachingTools/GPServer/";

args[0] = "Manage%20Map%20Cache%20Tiles/SubmitJob?";
args[1] = "service_url=http://arcgistest.domain.net:6080/arcgis/rest/services/TestServices/TestPoints/MapServer;
args[2] = "&levels=1155581.108577;577790.554289";
args[3] = "&thread_count=6";
args[4] = "&update_mode=RECREATE_ALL_TILES";
args[5] = "&f=pjson";
args[6] = "&token=" + token;



StringBuilder urlParameters = new StringBuilder();
urlParameters.Append(args[0].ToString());
urlParameters.Append(args[1].ToString());
urlParameters.Append(args[2].ToString());
urlParameters.Append(args[3].ToString());
urlParameters.Append(args[4].ToString());
urlParameters.Append(args[5].ToString());
urlParameters.Append(args[6].ToString());


Console.WriteLine(url + urlParameters.ToString());

HttpClient theClient = new HttpClient();
theClient.BaseAddress = new Uri(url);

//data response
HttpResponseMessage theResponse = theClient.GetAsync(urlParameters.ToString()).Result;
if (theResponse.IsSuccessStatusCode)
{

string responseData = theResponse.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseData);
Console.ReadKey();
}
}

This is the output:


{ "jobId": "j8f9f5f6412ac4d688540bad252cfee3e", "jobStatus": "esriJobSubmitted" }



Answer



I took the advice of KHibma -make an answer- and looked at the communication between ArcMap and ArcGIS Server using Fiddler. As expected, the "service_url" was incorrect.



I was using the rest service URL (which is incorrect): http://arcgistest.domain.net:6080/arcgis/rest/services/TestServices/TestPoints/MapServer


Instead, ArcMap sends the following text in the "service_url" parameter (which is correct): "TestServices/TestPoints:MapServer"


where "TestServices" is the Service directory and "TestPoints" is the Map Service.


The following code successfully re-created the map cache.


private static void TryMapCache(string[] args, string token)
{
args = new string[7];
string url = "http://arcgistest.domain.net:6080/arcgis/rest/services/System/CachingControllers/GPServer/";

args[0] = "Manage Map Cache Tiles/SubmitJob?";

args[1] = "service_url=TestServices/TestPoints:MapServer";
args[2] = "&levels=1155581.108577;577790.554289";
args[3] = "&thread_count=6";
args[4] = "&update_mode=RECREATE_ALL_TILES";
args[5] = "&f=pjson";
args[6] = "&token=" + token;


StringBuilder urlParameters = new StringBuilder();
urlParameters.Append(args[0].ToString());

urlParameters.Append(args[1].ToString());
urlParameters.Append(args[2].ToString());
urlParameters.Append(args[3].ToString());
urlParameters.Append(args[4].ToString());
urlParameters.Append(args[5].ToString());
urlParameters.Append(args[6].ToString());

Console.WriteLine(url + urlParameters.ToString());

HttpClient theClient = new HttpClient();

theClient.BaseAddress = new Uri(url);

//data response
HttpResponseMessage theResponse = theClient.GetAsync(urlParameters.ToString()).Result;
if (theResponse.IsSuccessStatusCode)
{
//parse the response body
string responseData = theResponse.Content.ReadAsStringAsync().Result;
Console.WriteLine(responseData);
Console.ReadKey();

}
}

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...