I have found that there exist some python script to export Survey123 data to your computer. Is there any similar code using the C# language with the ArcGIS Runtime SDK version 100.2.1?
I am trying to follow this link: Access the ArcGIS platform—ArcGIS Runtime SDK for .NET (WPF) | ArcGIS for Developers
But my application crash at the first line ( ArcGISPortal portal = await ArcGISPortal.CreateAsync();
)
Error code is the following:
"Une erreur s'est produite lors de l'envoi de la demande." System.Exception {System.Net.Http.HttpRequestException}
Any idea why?
EDIT: I found additionnal information about the error:
Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy filter is denied. )
EDIT: All problems solved. Here is the complete c# code to extract and delete the data (make sure you install and reference the arcgis Runtime .Net sdk and newtonSoft.JSON):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Esri.ArcGISRuntime;
using Esri.ArcGISRuntime.Security;
using Esri.ArcGISRuntime.Portal;
using Esri.ArcGISRuntime.Data;
using System.Net.Http;
using System.Threading;
using System.IO;
using System.Net;
using System.Collections.Specialized;
using Newtonsoft.Json;
namespace xFormAGO
{
public partial class Form1 : Form
{
string nomUtilisateur = "yourusername";
string motPass = "yourPassword";
//Your service URL will be different but similar
string ServiceUrl = @"https://services1.arcgis.com/xas33e1csd2dYTMBwrt4/ArcGIS/rest/services/service_832yf5aaa3a341fgucc03..."; //Layer 0
string dossier = @"C:\test\";
string fichier = "data.txt";
public Form1()
{
InitializeComponent();
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
}
//This button extract the data
private async void cmdExtraction_Click(object sender, EventArgs e)
{
try
{
//Create ArcGIS Token
var cred = await Esri.ArcGISRuntime.Security.AuthenticationManager.Current.GenerateCredentialAsync(
new Uri("https://www.arcgis.com/sharing/rest"),
nomUtilisateur,
motPass) as ArcGISTokenCredential;
//Build POST request
string reponseStr;
using (var wb = new WebClient())
{
//Request parameter. This one just download all data and Fields
var requete = new NameValueCollection();
requete["where"] = "1=1";
requete["f"] = "json";
requete["outFields"] = "*";
requete["token"] = cred.Token; //Important! Must be present
//Send request and wait for answer
var response = wb.UploadValues(ServiceUrl + "query", "POST", requete);
reponseStr = Encoding.UTF8.GetString(response); //Translate the answer to a JSON STRING
}
File.WriteAllText(dossier + fichier, reponseStr); //Export the JSON string into a text file
Rootobject dataResults = JsonConvert.DeserializeObject<Rootobject>(reponseStr); //Build the object containing the data. This line will crash for you here. Use google to understand how to convert a JSON string to a C# object. Or see the notes at the end of this code.
//Use this object to manipulate your data as you wish
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}
//This button delete the data
private async void cmdSupprimer_Click(object sender, EventArgs e)
{
//Create ArcGIS Token
var cred = await Esri.ArcGISRuntime.Security.AuthenticationManager.Current.GenerateCredentialAsync(
new Uri("https://www.arcgis.com/sharing/rest"),
nomUtilisateur,
motPass) as ArcGISTokenCredential;
//POST request to delete data
using (var wb = new WebClient())
{
//This request deletes everything in the layer 0
var data = new NameValueCollection();
data["where"] = "1=1";
data["f"] = "json";
data["token"] = cred.Token;
var response2 = wb.UploadValues(ServiceUrl + "deleteFeatures", "POST", data);
string responseInString = Encoding.UTF8.GetString(response2);
//Check the value of responseInString to see if deletion was successful
}
}
}
//
//Here you will past the content of "data.txt" that you received earlier!!!
//Very important
//
//Using visual studio, you will do a special paste as follow:
//-Open the data.txt file
//-Copy all content
//-Return back to visual studio and do a special "Paste as JSON format (Edition / special paste / paste JSON code as class)
//You will then be able to use a similar line of code: Rootobject dataResults = JsonConvert.DeserializeObject<Rootobject>(reponseStr);
Solved! Go to Solution.
Ok I found what was causing the error.
Here is how to solve it: Add this line at the beginning fo your code:
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
That's it! I am now able to connect to ArcGIS portals.
I should be able to figure out the rest.
Ok I found what was causing the error.
Here is how to solve it: Add this line at the beginning fo your code:
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
That's it! I am now able to connect to ArcGIS portals.
I should be able to figure out the rest.
Here is the complete c# code to extract and delete the data (make sure you install and reference the arcgis Runtime .Net sdk and newtonSoft.JSON):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Esri.ArcGISRuntime;
using Esri.ArcGISRuntime.Security;
using Esri.ArcGISRuntime.Portal;
using Esri.ArcGISRuntime.Data;
using System.Net.Http;
using System.Threading;
using System.IO;
using System.Net;
using System.Collections.Specialized;
using Newtonsoft.Json;
namespace xFormAGO
{
public partial class Form1 : Form
{
string nomUtilisateur = "yourusername";
string motPass = "yourPassword";
//Your service URL will be different but similar
string ServiceUrl = @"https://services1.arcgis.com/xas33e1csd2dYTMBwrt4/ArcGIS/rest/services/service_832yf5aaa3a341fgucc03..."; //Layer 0
string dossier = @"C:\test\";
string fichier = "data.txt";
public Form1()
{
InitializeComponent();
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;
}
//This button extract the data
private async void cmdExtraction_Click(object sender, EventArgs e)
{
try
{
//Create ArcGIS Token
var cred = await Esri.ArcGISRuntime.Security.AuthenticationManager.Current.GenerateCredentialAsync(
new Uri("https://www.arcgis.com/sharing/rest"),
nomUtilisateur,
motPass) as ArcGISTokenCredential;
//Build POST request
string reponseStr;
using (var wb = new WebClient())
{
//Request parameter. This one just download all data and Fields
var requete = new NameValueCollection();
requete["where"] = "1=1";
requete["f"] = "json";
requete["outFields"] = "*";
requete["token"] = cred.Token; //Important! Must be present
//Send request and wait for answer
var response = wb.UploadValues(ServiceUrl + "query", "POST", requete);
reponseStr = Encoding.UTF8.GetString(response); //Translate the answer to a JSON STRING
}
File.WriteAllText(dossier + fichier, reponseStr); //Export the JSON string into a text file
Rootobject dataResults = JsonConvert.DeserializeObject<Rootobject>(reponseStr); //Build the object containing the data. This line will crash for you here. Use google to understand how to convert a JSON string to a C# object. Or see the notes at the end of this code.
//Use this object to manipulate your data as you wish
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}
//This button delete the data
private async void cmdSupprimer_Click(object sender, EventArgs e)
{
//Create ArcGIS Token
var cred = await Esri.ArcGISRuntime.Security.AuthenticationManager.Current.GenerateCredentialAsync(
new Uri("https://www.arcgis.com/sharing/rest"),
nomUtilisateur,
motPass) as ArcGISTokenCredential;
//POST request to delete data
using (var wb = new WebClient())
{
//This request deletes everything in the layer 0
var data = new NameValueCollection();
data["where"] = "1=1";
data["f"] = "json";
data["token"] = cred.Token;
var response2 = wb.UploadValues(ServiceUrl + "deleteFeatures", "POST", data);
string responseInString = Encoding.UTF8.GetString(response2);
//Check the value of responseInString to see if deletion was successful
}
}
}
//
//Here you will past the content of "data.txt" that you received earlier!!!
//Very important
//
//Using visual studio, you will do a special paste as follow:
//-Open the data.txt file
//-Copy all content
//-Return back to visual studio and do a special "Paste as JSON format (Edition / special paste / paste JSON code as class)
//You will then be able to use a similar line of code: Rootobject dataResults = JsonConvert.DeserializeObject<Rootobject>(reponseStr);
I hope this help someone.