Using Data Contracts and DataContractJsonSerializer
:
References Required:
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Net;
Data Contract
[DataContract]
internal class GISData
{
[DataMember]
public string href;
[DataMember]
public int width;
[DataMember]
public int height;
[DataMember]
public GISDataExtent extent;
[DataMember]
public string scale;
}
[DataContract]
internal class GISDataExtent
{
[DataMember]
public string xmin;
[DataMember]
public string ymin;
[DataMember]
public string xmax;
[DataMember]
public string ymax;
[DataMember]
public GISDataExtentSpatialReference spatialReference;
}
[DataContract]
internal class GISDataExtentSpatialReference
{
[DataMember]
public string wkid;
}
Putting it all together and downloading the file:
Pull the JSON String from your URL - Deserialize the object and download your image.
WebClient webClient;
webClient = new WebClient();
string json = webClient.DownloadString(@"http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/export?bbox=9153621.1267%2C-644273.9207%2C13435472.9966%2C3637577.9492&bboxSR=&layers=&layerdefs=&size=800%2C600&imageSR=&format=png&transparent=false&dpi=&time=&layerTimeOptions=&f=pjson");
MemoryStream stream = new MemoryStream((Encoding.UTF8.GetBytes(json)));
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(GISData));
stream.Position = 0;
GISData data = (GISData)ser.ReadObject(stream);
stream.Close();
webClient = new WebClient();
webClient.DownloadFile(data.href, "C:/" + data.href.Substring(data.href.LastIndexOf("/") + 1)); //Save only the filename and not the entire URL as a name.