Load Data Source Dataflow Sample Code (C#)
Bing
The following C# code shows how to upload entity data to a data source by using the Load Data Source Dataflow. The code is provided in two parts. The first code sample creates a Load Data Source Dataflow job and monitors the job status. The second code sample provides general classes that support these operations.
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using BingMapsCsExamples.Properties;
namespace BingMapsCsExamples.Examples.Phase2
{
class SpatialDataUploading: ExamplesBase
{
/// <summary>
/// Upload spatial data to Bing Spatial Data Services
/// and wait for job completion (or timeout).
/// </summary>
public void UploadSpatialDataAndWaitForCompletion()
{
Console.WriteLine("Uploading spatial data...");
string statusUrl = UploadSpatialData();
Console.WriteLine("Spatial DataflowJob status URL: " + statusUrl);
Console.WriteLine("Waiting for job completion...");
string location = QueryDataflowJobStatus(statusUrl, 180);
Console.WriteLine("Spatial Data location: " + statusUrl);
}
/// <summary>
/// Bing Maps REST examples of uploading data to Spatial Data Services (SDS).
/// </summary>
/// <returns>The URL of the DataflowJob, with master key,
/// that can be used to query status.</returns>
public string UploadSpatialData()
{
// http://spatial.virtualearth.net/REST/v1/Dataflows/LoadDataSource?dataSourceName=MyShopsSample&loadOperation=complete&input=xml&output=xml&key=masterKey
// Custom name of spatial data source created during upload.
string dataSourceName = "MyShopsSample";
// Path to the spatial data input file to be uploaded.
string dataFilePath = @".\Data\SpatialDataUploadExampleData1.xml";
// The master key used for uploading to Spatial Data Services.
// This key should differ from your query key.
string bingMapsMasterKey = Settings.Default.BingMapsMasterKey;
// Create the spatial data upload URL.
StringBuilder queryStringBuilder = new StringBuilder();
queryStringBuilder.Append("dataSourceName=");
queryStringBuilder.Append(Uri.EscapeUriString(dataSourceName));
queryStringBuilder.Append("&loadOperation=complete");
// Use xml input and output for the spatial data.
// You could use any of: xml, csv, tab, or pipe.
queryStringBuilder.Append("&input=xml");
queryStringBuilder.Append("&output=xml");
queryStringBuilder.Append("&key=");
queryStringBuilder.Append(Uri.EscapeUriString(bingMapsMasterKey));
UriBuilder uriBuilder = new UriBuilder("http://spatial.virtualearth.net");
uriBuilder.Path = "/REST/v1/Dataflows/LoadDataSource";
uriBuilder.Query = queryStringBuilder.ToString();
// Create the request object. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriBuilder.Uri);
// The HTTP method must be 'POST'.
request.Method = "POST";
request.ContentType = "application/xml";
// Write the request body with the
// spatial data XML file contents (schema and data).
using(FileStream dataStream = File.OpenRead(dataFilePath))
{
using(Stream requestStream = request.GetRequestStream())
{
byte[] buffer = new byte[16384];
int bytesRead = dataStream.Read(buffer, 0, buffer.Length);
while (bytesRead > 0)
{
requestStream.Write(buffer, 0, bytesRead);
bytesRead = dataStream.Read(buffer, 0, buffer.Length);
}
}
}
string dataflowJobUrl = null;
// Submit the HTTP request and check if the
// job was created successfully.
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// // If the job was created successfully, the status code should be
// 201 (Created) and the 'Location' header should contain a URL
// that defines the location of the new dataflow job. You use this
// URL with the Bing Maps Key to query the status of your job.
//
if (response.StatusCode != HttpStatusCode.Created)
throw new Exception("An HTTP error status code was " +
"encountered when creating the geocode job.");
dataflowJobUrl = response.GetResponseHeader("Location");
if (String.IsNullOrEmpty(dataflowJobUrl))
throw new Exception("The 'Location' header is " +
"missing from the HTTP response " + "when creating a geocode job.");
}
string jobStatusQueryUrl = string.Format("{0}?key={1}", dataflowJobUrl,
Uri.EscapeUriString(bingMapsMasterKey));
Console.WriteLine("Upload job location = " + dataflowJobUrl);
return jobStatusQueryUrl;
}
/// <summary>
/// Bing Maps REST example of querying a
/// Spatial Data Services DataflowJob status.
/// Blocks the calling thread until the DataflowJob
/// completes or until a timeout is reached.
/// </summary>
/// <param name="jobStatusQueryUrl">The URL used to query
/// the upload job status.
/// Must contain your Bing Maps Key
/// as a query parameter.</param>
/// <returns>The URL of the uploaded data flow.</returns>
/// <exception cref="Exception">On upload
/// error or timeout.</exception>
public string QueryDataflowJobStatus(string jobStatusQueryUrl, int
timeoutInSeconds)
{
// int timeoutInSeconds = 120;
string dataSourceUrl = null;
const int secondsBetweenPolls = 5;
int maxCount = timeoutInSeconds / secondsBetweenPolls;
if (maxCount < 1)
{
maxCount = 1;
}
for (int checkCounter = 0; checkCounter < maxCount; ++checkCounter)
{
Console.WriteLine("Querying job status: " + jobStatusQueryUrl);
// Check the job status by making a
// request to the job status URL.
BingMapsRestV1.Response jsonResponse = GetJsonResponse
(jobStatusQueryUrl);
BingMapsRestV1.DataflowJob job =
jsonResponse.ResourceSets[0].Resources[0] as
BingMapsRestV1.DataflowJob;
if (job.Status == "Completed")
{
foreach (BingMapsRestV1.Link link in job.Links)
{
if (link.Role == "dataSource")
{
// There can be multiple data source
// links but for this example,
// we just use the first link.
dataSourceUrl = link.Url;
break;
}
}
break;
}
else if (job.Status == "Aborted")
{
throw new Exception("The spatial data upload " +
"failed with status: " + job.Status + " Job location: " +
jobStatusQueryUrl + " Error message: " + job.ErrorMessge);
}
// Job status is "Pending" or otherwise incomplete.
// Wait to poll the job status again.
Thread.Sleep(secondsBetweenPolls * 1000);
}
if (string.IsNullOrEmpty(dataSourceUrl))
{
throw new Exception("Timed out or otherwise failed to " +
"find the dataSource link in the data flow job. " + " Job location: "
+ jobStatusQueryUrl);
}
return dataSourceUrl;
}
}
}
using System;
using System.IO;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Xml;
using BingMapsCsExamples.Helpers;
using BingMapsCsExamples.Properties;
namespace BingMapsCsExamples.Examples
{
/// <summary> /// Base class containing functionality common across the examples,
/// such as JSON and XML response processing.
/// </summary> public abstract class ExamplesBase
{
#region Static members
/// <summary>
/// Your Bing Maps Key. You can either replace the value
/// here or you can add a Settings value to your project.
/// </summary> protected static string BingMapsKey = Settings.Default.BingMapsKey;
/// <summary> /// Send the request to the Bing Maps REST API
/// and deserialize the JSON response.
/// </summary>
public static BingMapsRestV1.Response GetJsonResponse(string requestUrl)
{
System.Diagnostics.Trace.WriteLine("Request URL (JSON): " + requestUrl);
HttpWebRequest request = WebRequest.Create(requestUrl)as HttpWebRequest;
using(HttpWebResponse response = request.GetResponse()as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception(String.Format("Server error (HTTP {0}: {1}).",
response.StatusCode, response.StatusDescription));
DataContractJsonSerializer jsonSerializer = new
DataContractJsonSerializer(typeof(BingMapsRestV1.Response));
object objResponse = jsonSerializer.ReadObject
(response.GetResponseStream());
BingMapsRestV1.Response jsonResponse = objResponse as
BingMapsRestV1.Response;
return jsonResponse;
}
}
/// <summary>
/// Send the request to the Bing Maps REST API and deserialize the XML response.
/// </summary>
public static XmlDocument GetXmlResponse(string requestUrl)
{
System.Diagnostics.Trace.WriteLine("Request URL (XML): " + requestUrl);
HttpWebRequest request = WebRequest.Create(requestUrl)as HttpWebRequest;
using(HttpWebResponse response = request.GetResponse()as HttpWebResponse)
{
if (response.StatusCode != HttpStatusCode.OK)
throw new Exception(String.Format("Server error (HTTP {0}: {1}).",
response.StatusCode, response.StatusDescription));
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(response.GetResponseStream());
TraceXmlDocument(xmlDoc);
return xmlDoc;
}
}
/// <summary>
/// Write an XML document to Diagnostics.Trace.
/// </summary>
private static void TraceXmlDocument(XmlDocument xmlDoc)
{
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
xmlDoc.WriteTo(xw);
System.Diagnostics.Trace.WriteLine(sw.ToString());
}
#endregion
}
}
Show: