Nano Hash - криптовалюты, майнинг, программирование

AJAX CORS PUT в хранилище BLOB-объектов Azure возвращает ошибку 405

У меня есть приложение MVC, которое позволяет пользователю загружать ресурс в хранилище BLOB-объектов с помощью динамически генерируемого SAS. Пользователь выберет файл и нажмет «Загрузить». При нажатии кнопки «Загрузить» в действие контроллера отправляется вызов ajax, который генерирует SAS для контейнера и возвращает строку, которая является URI для большого двоичного объекта, который будет загружен с добавленной подписью. Это отлично работает и возвращает правильный URI с SAS. Затем у меня есть еще один вызов ajax, который поместит данные из файла в хранилище BLOB-объектов Azure, используя возвращенный URI. Когда это выполняется, я получаю ошибку времени выполнения javascript в файле Jquery.min с надписью «0x80070005 Access is Denied».

Я хотел убедиться, что я закодировал это правильно и что мой SAS был правильным, поэтому я запустил его через Runscope (у меня было действие контроллера MVC, чтобы изменить URI для прохождения через мою учетную запись Runscope). Если я скопировал URI и вручную установил заголовки, которые я устанавливаю в вызове ajax, это сработало. И настройки разрешений работают. С созданным мной SAS я могу получить доступ к файлу, без него я не могу. Если я позволю ему пройти через мой файл javascript с вызовом ajax, он потерпит неудачу и вернет ошибку 405. Вот мой вызов ajax, а затем два разных запроса, отправленных с помощью Runscope.

Я использовал эту статью http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/#comment-1700 в качестве руководства для загрузки файла по частям. Следующий ajax-вызов будет выполняться для каждого загруженного блока, но с первой попытки произойдет сбой.

var uri = submitUri + "&comp=block&blockid=" + blockIds[blockIds.length - 1];
var requestData = new Uint8Array(evt.target.result);
$.ajax({
    url: uri,
    type: "PUT",
    data: requestData,
    processData: false,
    beforeSend: function(xhr) {
        xhr.setRequestHeader("x-ms-blob-type", "BlockBlob");
        xhr.setRequestHeader("Content-Length", requestData.length);
    },
    success: function() {
        // successful stuff here
        uploadFileInBlocks();
    }
    error: function (xhr, desc, err) {
        // error stuff here
    }
});

И вот мои результаты Runscope:

Успешный ручной запрос:

PUT https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/georgewashington.jpg?sr=c&sp=rw&sig=GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=&sv=2012-02-12&se=2013-09-17T13:19:52Z

HEADERS
Accept: */*
Accept-Encoding: gzip, deflate, compress
Connection: close
Host: atlastestblob.blob.core.windows.net
User-Agent: runscope/0.1
X-Ms-Blob-Type: BlockBlob

QUERYSTRING
se: 2013-09-17T13:19:52Z
sig: GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=
sp: rw
sr: c
sv: 2012-02-12

Response: 201 Created

Неудачный запрос ajax:

OPTIONS https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/cslewis.jpg?sp=rw&sr=c&blockid=YmxvY2stMDAwMDAw&sv=2012-02-12&sig=iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=&comp=block&se=2013-09-17T13:40:00Z

HEADERS
Accept: */*
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: content-type, accept, x-ms-blob-type
Access-Control-Request-Method: PUT
Cache-Control: no-cache
Connection: close
Dnt: 1
Host: atlastestblob.blob.core.windows.net
Origin: https://localhost:44308
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)

QUERYSTRING
blockid: YmxvY2stMDAwMDAw
comp: block
se: 2013-09-17T13:40:00Z
sig: iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=
sp: rw
sr: c
sv: 2012-02-12

Response: 405 The resource doesn't support specified Http Verb

  • Azure не поддерживает CORS. Ваше веб-приложение и хранилище BLOB-объектов должны находиться в одном домене, как указано в статье. В вашей ситуации это явно не так. Вам нужно либо убедиться, что ваше приложение и хранилище BLOB-объектов находятся в одном домене, либо отправлять файлы со своего сервера, а не напрямую из клиента или браузера. 17.09.2013
  • Я думал, что MS добавила поддержку CORS еще в марте... может быть, я ошибалась. 17.09.2013
  • Неа. И отсутствие поддержки OPTIONS является еще одним доказательством того, что этого не существует. Браузер отправит запрос OPTIONS для любых непростых запросов между источниками. См. спецификацию для более подробной информации об этом. Я только что выполнил быстрый поиск, и поддержка CORS все еще ожидается: feedback.windowsazure.com/forums/217298-storage/suggestions/ 17.09.2013

Ответы:


1

Хранилище Windows Azure теперь поддерживает как предварительный запрос CORS OPTIONS, так и фактические запросы CORS:

http://blogs.msdn.com/b/windowsazurestorage/archive/2013/11/27/windows-azure-storage-release-introduction-cors-json-minute-metrics-and-more.aspx

28.11.2013

2

Как также было объявлено на странице BUILD, хранилище Windows Azure получит поддержку CORS к концу 2013 года.

24.09.2013

3

Один из полезных MSDN Блог может помочь вам всем.

Код, который мне не хватало, был

private static void ConfigureCors(ServiceProperties serviceProperties)
{
    serviceProperties.Cors = new CorsProperties();
    serviceProperties.Cors.CorsRules.Add(new CorsRule()
    {
        AllowedHeaders = new List<string>() { "*" },
        AllowedMethods = CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post,
        AllowedOrigins = new List<string>() { "*" },
        ExposedHeaders = new List<string>() { "*" },
        MaxAgeInSeconds = 1800 // 30 minutes
     });
}

В основном это добавляет некоторые правила к URL-адресу SAS, и я могу загружать свои файлы в blob.

21.04.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..