/// <summary> /// Get a specific resource. /// </summary> /// <param name="guid"></param> /// <param name="resourceName"></param> /// <param name="versionContentType">Specify if a specific version of the model should be requested, if null, versionless will be used</param> /// <returns></returns> public virtual GetResponse Get(Guid guid, string resourceName, string versionContentType) { if (resourceName == null) { throw new Exception("ResourcePluralName missing. Unable to identify resource name : [" + resourceName + "]"); } bool authenticated = Authenticate().Result; if (authenticated) { NameValueCollection headers = new NameValueCollection(); ConstructAcceptHeader(headers, versionContentType); var resource = ConstructResourceUri("api", resourceName, guid.ToString()); var response = ExecuteRequest(HttpMethod.Get, null, resource, null, headers); if (response.IsSuccessStatusCode) { GetResponse getResponse = new GetResponse(); getResponse.Data = response.Content.ReadAsStringAsync().Result; if (response.Headers.Contains(Media_Type_Header)) { getResponse.Version = response.Headers.GetValues(Media_Type_Header).FirstOrDefault(); } getResponse.TotalCount = 1; return(getResponse); } else { //throw exception throw new Exception(); } } else { //throw exception throw new Exception(); } }
/// <summary> /// This method will use Ethos Integration to lookup many individual GUIDS with the persons resource and report an average of how long it takes. /// </summary> /// <returns></returns> internal static async Task TimeSinglePersonsSync() { // Print out the configuration used to generate the numbers for this run Console.WriteLine("Method: Start TimeSinglePersonsSync()"); Console.WriteLine(" ** numGUIDIterations: " + numGUIDIterations); Console.WriteLine(" ** resourceName: " + resourceName); Console.WriteLine(" ** criteria: " + criteria); Console.WriteLine(" ** Time of run: " + DateTime.Now.ToString("MM/dd/yyyy h:mm:ss")); string[] guids = new string[numGUIDIterations]; // Setup as parameters on the URL query for the GetAll call Dictionary <string, string> searchParams = new Dictionary <string, string>(); searchParams.Add("criteria", criteria); if (await ec.Authenticate()) { // First, lookup a large group of GUIDs so we can look them up individually var watch = System.Diagnostics.Stopwatch.StartNew(); GetResponse GUIDsResponse = ec.GetAll(resourceName, searchParams, offset: 0, limit: numGUIDIterations); // Get an array of results from Ethos watch.Stop(); Console.WriteLine(" Wait time for lookup on criteria ** " + criteria + " **: " + watch.ElapsedMilliseconds + " msec."); JArray a = JArray.Parse(GUIDsResponse.Data); if (a.Count < numGUIDIterations) { Console.WriteLine(" Based on the search criteria, only " + a.Count + " records were returned."); } // Put the returned GUIDs in an array for (int i = 0; i < numGUIDIterations && i < a.Count; i++) { JObject o = (JObject)a[i]; string guid = (string)o["id"]; guids[i] = guid; } long totalGUIDLookupTime = 0; int j = 1; // Now, one by one, let's look them up and time each run. Add those together as we go and get the average. for (j = 0; j < numGUIDIterations && j < a.Count; j++) { watch = System.Diagnostics.Stopwatch.StartNew(); GetResponse singlePersonResponse = ec.Get(new Guid(guids[j]), resourceName, "application/vnd.hedtech.integration.v12+json"); // Get a single result from Ethos, for version 12 watch.Stop(); totalGUIDLookupTime += watch.ElapsedMilliseconds; JObject o = JObject.Parse(singlePersonResponse.Data); string fullname = (string)o["names"][0]["fullName"]; Console.WriteLine(" Wait time for lookup on GUID " + guids[j] + ": " + watch.ElapsedMilliseconds + " msec - name: " + fullname); if (j == 0) { Console.WriteLine(o); // I used this during my testing of Ethos Extend to make sure the extensions were active } } Console.WriteLine(" Average wait time for call to Ethos: " + totalGUIDLookupTime / j + " msec."); } else { Console.WriteLine(" Didn't authenticate"); } ec.Dispose(); Console.WriteLine("Method: End TimeSinglePersonsSync()"); }
/// <summary> /// Get a page of resources from the authoritative source starting at offset /// </summary> /// <param name="resourceName"></param> /// <param name="urlParameters"></param> /// <param name="offset"></param> /// <param name="limit"></param> /// <param name="versionContentType">Specify if a specific version of the model should be requested, if null, versionless will be used</param> /// <returns></returns> public virtual GetResponse GetAll(string resourceName, Dictionary <string, string> urlParameters = null, int offset = 0, int limit = -1, string versionContentType = null) { if (resourceName == null) { throw new Exception("ResourcePluralName missing. Unable to identify resource name : [" + resourceName + "]"); } bool authenticated = Authenticate().Result; if (authenticated) { var resource = ConstructResourceUri("api", resourceName); NameValueCollection headers = new NameValueCollection(); ConstructAcceptHeader(headers, versionContentType); if (urlParameters == null) { urlParameters = new Dictionary <string, string>(); } urlParameters[Offset_Param] = offset.ToString(); if (limit > 0) { urlParameters[Limit_Param] = limit.ToString(); } var response = ExecuteRequest(HttpMethod.Get, null, resource, urlParameters, headers); if (response.IsSuccessStatusCode) { GetResponse getAllResponse = new GetResponse(); getAllResponse.Data = response.Content.ReadAsStringAsync().Result; if (response.Headers.Contains(Media_Type_Header)) { getAllResponse.Version = response.Headers.GetValues(Media_Type_Header).FirstOrDefault(); } if (response.Headers.Contains(Total_Count_Header)) { var countHeader = response.Headers.GetValues(Total_Count_Header).FirstOrDefault(); if (!string.IsNullOrWhiteSpace(countHeader)) { getAllResponse.TotalCount = Int32.Parse(countHeader); } } else { // Todo: Temp workaround for the Mock API Server until it returns the header record count //throw new HttpRequestFailedException("Missing X-Total-Count header", response.StatusCode); getAllResponse.TotalCount = 0; } return(getAllResponse); } else { //throw exception throw new Exception(); } } else { //throw exception throw new Exception(); } }