private HttpResponseMessage ExecuteRestRequest(HtmlVerb verb, Uri fullUri, HttpContent content = null, Dictionary <string, string> additionalHeaders = null) { DateTime dt = DateTime.UtcNow; using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("x-ms-date", dt.ToString("R")); client.DefaultRequestHeaders.Add("x-ms-version", apiVersion); if (additionalHeaders != null) { foreach (var header in additionalHeaders) { client.DefaultRequestHeaders.Add(header.Key, header.Value); } } string canonicalizedHeaders = GetCanonicalizedHeaders(client.DefaultRequestHeaders, (content != null ? content.Headers : null)); string canonicalizedResource = GetCanonicalizedResource(fullUri); string contentLengthHeader = (content != null && content.Headers.Any(h => h.Key == "Content-Length") ? content.Headers.First(h => h.Key == "Content-Length").Value.First() : ""); if (contentLengthHeader == "0") { contentLengthHeader = ""; } string md5Header = (content != null && content.Headers.Any(h => h.Key == "Content-MD5") ? content.Headers.First(h => h.Key == "Content-MD5").Value.First() : ""); string sharedKey = string.Format(skaTemplate, verb.ToString(), "", "", contentLengthHeader, md5Header, "", "", "", "", "", "", "", canonicalizedHeaders, canonicalizedResource); string signedSharedKey = SignSka(sharedKey, key, account); client.DefaultRequestHeaders.Add("Authorization", signedSharedKey); switch (verb) { case HtmlVerb.HEAD: return(client.SendAsync(new HttpRequestMessage(HttpMethod.Head, fullUri)).Result); case HtmlVerb.GET: return(client.GetAsync(fullUri).Result); case HtmlVerb.PUT: return(client.PutAsync(fullUri, content).Result); case HtmlVerb.POST: return(client.PostAsync(fullUri, content).Result); case HtmlVerb.DELETE: return(client.DeleteAsync(fullUri).Result); } } return(null); }
private HttpResponseMessage ExecuteRestRequest(HtmlVerb verb, Uri fullUri, HttpContent content = null, Dictionary <string, string> additionalHeaders = null) { DateTime dt = DateTime.UtcNow; Uri finalUri = new Uri(fullUri.OriginalString); using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("x-ms-date", dt.ToString("R")); client.DefaultRequestHeaders.Add("x-ms-version", apiVersion); if (additionalHeaders != null) { foreach (var header in additionalHeaders) { client.DefaultRequestHeaders.Add(header.Key, header.Value); } } if (isSasToken) { // eliminate the ? if it exists at the start of the key, so it will always be added on to the current query string modifiedKey = key.StartsWith("?") ? key.Remove(0, 1) : key; UriBuilder uriBuilder = new UriBuilder(finalUri); uriBuilder.Query = uriBuilder.Query == string.Empty ? $"{modifiedKey}" : $"{uriBuilder.Query}&{modifiedKey}"; finalUri = uriBuilder.Uri; } else { string canonicalizedHeaders = GetCanonicalizedHeaders(client.DefaultRequestHeaders, (content != null ? content.Headers : null)); string canonicalizedResource = GetCanonicalizedResource(finalUri); string contentLengthHeader = (content != null && content.Headers.Any(h => h.Key == "Content-Length") ? content.Headers.First(h => h.Key == "Content-Length").Value.First() : ""); if (contentLengthHeader == "0") { contentLengthHeader = ""; } string md5Header = (content != null && content.Headers.Any(h => h.Key == "Content-MD5") ? content.Headers.First(h => h.Key == "Content-MD5").Value.First() : ""); string sharedKey; if (!isTableStorage) { sharedKey = string.Format(skaTemplate, verb.ToString(), "", "", contentLengthHeader, md5Header, "", "", "", "", "", "", "", canonicalizedHeaders, canonicalizedResource); } else { string contentTypeHeader = (content != null && content.Headers.Any(h => h.Key == "Content-Type") ? content.Headers.First(h => h.Key == "Content-Type").Value.First() : ""); sharedKey = string.Format(skaTableTemplate, verb.ToString(), md5Header, contentTypeHeader, dt.ToString("R"), canonicalizedResource); } string signedSharedKey = SignSka(sharedKey, key, account); client.DefaultRequestHeaders.Add("Authorization", signedSharedKey); } try { switch (verb) { case HtmlVerb.HEAD: return(client.SendAsync(new HttpRequestMessage(HttpMethod.Head, finalUri)).Result); case HtmlVerb.GET: return(client.GetAsync(finalUri).Result); case HtmlVerb.PUT: return(client.PutAsync(finalUri, content).Result); case HtmlVerb.POST: return(client.PostAsync(finalUri, content).Result); case HtmlVerb.DELETE: return(client.DeleteAsync(finalUri).Result); } } catch (Exception ex) { throw new Microsoft.Xrm.Sdk.InvalidPluginExecutionException(ex.Message); } } return(null); }