Я использую Azure CDN и использую rest api
для загрузки или загрузки файла из CDN
.Все работает хорошо.Но когда я пытаюсь выполнить те же операции с новым доменным именем (https://someName.com/
), операция загрузки работает нормально, но во время загрузки я получаю
Forbidden; Server failed to authenticate the request.
Мои экзамены:
СОперация загрузки отлично работает с новым доменом. Я думаю, это означает, что с новым доменом проблем нет.
Поскольку операция загрузки отлично работает со старым доменом (http://someOldName.com/
), это означает, что я все правильно сделал сзаголовок авторизации и т. д. Поскольку я просто изменяю только часть домена конечной точки и пытаюсь снова сделать запрос на загрузку, но безуспешно.
Я попытался сгенерировать новые ключи после изменения домена и попытался сделатьзапрос на загрузку с новым ключом, но снова безуспешно
Что мне не хватает?Есть ли какие-либо другие конфигурации, которые я должен сделать?
Я использую httpClient
, чтобы сделать put
запрос.Вот код, который я использую:
public static HttpClient GetHttpClient(AzureOperationType azureOperationType, HttpContent httpContent, Uri uri, Dictionary<string, string> headers = null)
{
var client = new HttpClient();
string contentType = "";
HttpMethod httpMethod = HttpMethod.Get;
client.Timeout = GetTimeout(APP_SETTINGS.CDNTimeout);
client.DefaultRequestHeaders.Add("x-ms-date", DateTime.Now.ToUniversalTime().ToString("r"));
client.DefaultRequestHeaders.Add("x-ms-version", AzureApiVersion);
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
}
if (azureOperationType == AzureOperationType.PutBlockList)
{
contentType = "text/plain";
}
if (azureOperationType == AzureOperationType.GetBlob || azureOperationType == AzureOperationType.ListBlob)
{
httpMethod = HttpMethod.Get;
}
else if (azureOperationType == AzureOperationType.PutBlock || azureOperationType == AzureOperationType.PutBlockList || azureOperationType == AzureOperationType.CopyBlob)
{
httpMethod = HttpMethod.Put;
}
else if (azureOperationType == AzureOperationType.DeleteBlob)
{
httpMethod = HttpMethod.Delete;
}
else if (azureOperationType == AzureOperationType.GetBlobProperties)
{
httpMethod = HttpMethod.Head;
}
var canonicalizedHeaders = GetCanonicalizedHeaders(client);
var canonicalizedResource = GetCanonicalizedResource(uri, APP_SETTINGS.StorageAccount);
var stringToSign = String.Format("{0}\n\n\n{1}\n\n{4}\n\n\n\n\n\n\n{2}{3}",
httpMethod.ToString(),
(httpContent != null) ? httpContent.Headers.ContentLength.ToString() : "",
canonicalizedHeaders,
canonicalizedResource,
contentType);
var authorizationHeader = CreateAuthorizationHeader(stringToSign);
client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);
return client;
}
И совершаю вызов с помощью следующей функции:
public static ActionResultCDN UploadBlock(String baseUri, String blockId, byte[] contentBytes)
{
ActionResultCDN ActionResultCDN = new ActionResultCDN();
HttpResponseMessage response = null;
var uri = new Uri(baseUri + "?comp=block&blockid=" + System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId))));
HttpContent content = new ByteArrayContent(contentBytes);
content.Headers.ContentLength = contentBytes.Length;
using (var client = GetHttpClient(AzureOperationType.PutBlock, content, uri))
{
var result = client.PutAsync(uri, content);
ActionResultCDN = ProcessResult(result, out response);
}
return ActionResultCDN;
}
После client.PutAsync
я получаю ошибку 403.