Exemplo n.º 1
0
        public static EditResultSet ApplyEdits(ServiceArgs args, int layerId, string operation, string json)
        {
            var url  = $"{args.Url}/{layerId}/applyEdits";
            var data = $"{operation}={Compatibility.UrlEncode(operation == "deletes" ? json : RemoveNullZ(json))}";

            return(GetResponse <EditResultSet>(url, data, args.Credentials, args.Token, args.GdbVersion));
        }
Exemplo n.º 2
0
        public static TokenInfo GetTokenInfo(string url, string username, string password, int?expiration)
        {
            var tokenUrl = url.IsArcGISOnline()
                ? "https://www.arcgis.com/sharing/rest/generateToken"
                : $"{Regex.Match(url, @"^http.*?(?=(/rest/services/))", RegexOptions.IgnoreCase).Value}/tokens/generateToken";
            var data = $"username={Compatibility.UrlEncode(username)}&password={Compatibility.UrlEncode(password)}&clientid=requestip&expiration={expiration}";

            return(GetResponse <TokenInfo>(tokenUrl, data, null, null, null));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Downloads records and yields them as a lazy sequence of features of the specified type.  Possibly throws RestException.
        /// </summary>
        /// <typeparam name="T">The type the record should be mapped to.</typeparam>
        /// <param name="layerId">The layer ID of the feature layer or table.</param>
        /// <param name="whereClause">The where clause.  If set to null, returns all features.</param>
        /// <param name="geometry">The geometry used to spatially filter the records.</param>
        /// <param name="spatialRel">The spatial relationship used for filtering.</param>
        /// <param name="extraParameters">The query string that describes any additional query parameters (i.e. outSR=4326).  Each parameter must be url encoded.</param>
        /// <param name="keepQuerying">If set to true, repetitively queries the server until all features have been returned.</param>
        /// <param name="degreeOfParallelism">The maximum number of concurrent requests.</param>
        /// <returns></returns>
        public IEnumerable <T> Download <T>(int layerId, string whereClause, GeometryBase geometry, SpatialRel spatialRel, string extraParameters = null, bool keepQuerying = false, int degreeOfParallelism = 1) where T : Feature
        {
            if (geometry == null)
            {
                return(Download <T>(layerId, whereClause, extraParameters, keepQuerying, degreeOfParallelism));
            }

            string geometryType;

            if (geometry is Point)
            {
                geometryType = "esriGeometryPoint";
            }
            else if (geometry is Multipoint)
            {
                geometryType = "esriGeometryMultipoint";
            }
            else if (geometry is Polyline)
            {
                geometryType = "esriGeometryPolyline";
            }
            else if (geometry is Polygon)
            {
                geometryType = "esriGeometryPolygon";
            }
            else if (geometry is Envelope)
            {
                geometryType = "esriGeometryEnvelope";
            }
            else
            {
                throw new ArgumentException("This geometry type is not supported.", nameof(geometry));
            }

            var spatialFilter = $"geometry={Compatibility.UrlEncode(geometry.ToString())}&geometryType={geometryType}&spatialRel=esriSpatialRel{spatialRel}";

            return(Download <T>(layerId, whereClause, string.IsNullOrEmpty(extraParameters) ? spatialFilter : (extraParameters + "&" + spatialFilter), keepQuerying, degreeOfParallelism));
        }
Exemplo n.º 4
0
 private static string CleanObjectIds(IEnumerable <int> objectIds)
 {
     return(objectIds == null ? "" : Compatibility.UrlEncode(string.Join(",", objectIds)));
 }
Exemplo n.º 5
0
 private static string CleanWhereClause(string whereClause)
 {
     return(Compatibility.UrlEncode(string.IsNullOrWhiteSpace(whereClause) ? "1=1" : whereClause));
 }
Exemplo n.º 6
0
        private static T GetResponse <T>(string url, string data, ICredentials credentials, Token token, string gdbVersion) where T : Response
        {
            var parameters = new Dictionary <string, object> {
                { "token", token }, { "gdbVersion", gdbVersion }, { "f", "json" }
            };
            var queryString = string.Join("&", parameters.Where(p => p.Value != null).Select(p => $"{p.Key}={Compatibility.UrlEncode(p.Value.ToString())}"));

            var isPost = data != null;

            var url2        = isPost ? url : url + "?" + queryString;
            var requestText = isPost ? data + "&" + queryString : "";

            string responseText = null;

            try
            {
                var requestModifier = credentials == null ? (Action <HttpWebRequest>)null : r => r.Credentials = credentials;
                responseText = isPost ? Http.Post(url2, requestText, requestModifier) : Http.Get(url2, requestModifier);

                var response     = responseText.Deserialize <T>();
                var errorMessage = "ArcGIS Server returned an error response.";

                if (response.error != null)
                {
                    throw new InvalidOperationException(errorMessage);
                }

                var resultSet = response as EditResultSet;

                if (resultSet != null && new[] { resultSet.addResults, resultSet.updateResults, resultSet.deleteResults }.Any(results => results == null || results.Any(r => !r.success)))
                {
                    throw new InvalidOperationException(errorMessage);
                }

                return(response);
            }
            catch (Exception ex)
            {
                throw new RestException(url2, requestText, responseText, $"An error occurred while processing a request against '{url2}'.", ex);
            }
        }