Windows Azure - инициализация хранилища BLOB-объектов - ошибка авторизации - PullRequest
3 голосов
/ 09 ноября 2010

Фон :

У меня есть приложение Azure с одной веб-ролью, которое является приложением ASP.NET (C #), которое использует приложение для построения диаграмм для отображения результатов расчета.Приложению для построения диаграмм необходим файл XML.Для доступа к этому XML-файлу (указанному в JavaScript) я использую XDocument и связанные с ним классы для управления файлом, а затем сохраняю его, при обновлении страницы загружается элемент управления диаграммой.

Ошибка :

При попытке работать (GetPermissions, Create, Create, если не существует и т. Д.) С объектом container , я получаю следующую ошибку:

Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка Authorization сформировано правильно, включая подпись.

Я также пытался создать контейнер заранее с помощью SpaceBlock, похоже, это не должно было изменить результат.

Код :

Вот функция, которую я вызываю на Page_Load.Ошибка происходит на строке, выделенной жирным шрифтом (GetPermissions):

    private void InitializeStorage()
    {
        if (storageInitialized)
        {
            return;
        }

        lock (gate)
        {
            if (storageInitialized)
            {
                return;
            }

            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // read account configuration settings
                var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

                // create blob container for images
                blobStorage = storageAccount.CreateCloudBlobClient();
                CloudBlobContainer container = blobStorage.GetContainerReference("xml");

                // configure container for public access
                **var permissions = container.GetPermissions();**
                permissions.PublicAccess = BlobContainerPublicAccessType.Container;
                container.SetPermissions(permissions);

                CloudBlob opcBlob = container.GetBlobReference("OptionPriceChart.xml");
                opcBlob.DownloadToFile("opcLocal.xml");

            }
            catch (WebException)
            {
                throw new WebException("Storage services initialization failure. "
                    + "Check your storage account configuration settings. If running locally, "
                    + "ensure that the Development Storage service is running.");
            }

            storageInitialized = true;
        }
    }

1 Ответ

1 голос
/ 09 ноября 2010

Я не вижу в вашем коде ничего такого, что могло бы вызвать проблему, о которой вы говорите. Вам нужно будет убедиться, что вы сделали CreateIfNotExist перед вызовом разрешений, в противном случае вы получите ошибку The specified container does not exist (что, я полагаю, вы делали до того, как столкнулись с текущей проблемой).

Поскольку код выглядит нормально, это может означать, что это что-то в вашей среде вызывает у вас горе, скорее всего, строку подключения. Я попытался воспроизвести вашу проблему, поиграв со строкой соединения, и единственный способ получить точно такую ​​же ошибку - использовать AccountName с действительным AccountKey из другой учетной записи. Поэтому я предлагаю вернуться на портал Azure, перейти к службе хранения и скопировать первичный ключ доступа в конфигурацию облака.

...