Сохранение MemoryStream в хранилище BLOB-объектов Azure

Я использую систему отчетов Infragistics, чтобы создавать отчеты в виде PDF-файлов и сохранять их в хранилище BLOB-объектов Azure, но мне не удается заставить его работать. Я без проблем генерирую отчет как объект Report. У этого объекта есть метод Publish, который публикует отчет в потоке в указанном формате файла, которым в моем случае является PDF. Когда код пытается загрузить из потока, я получаю эту ошибку

Microsoft.WindowsAzure.Storage.StorageException: удаленный сервер возвратил ошибку: (400) неверный запрос

Я понятия не имею, что вызывает это, сообщение об ошибке на самом деле не дает мне много работы. Я использую локальное хранилище во время разработки, все вроде работает нормально (я могу хранить изображения без проблем). Это метод, который вылетает

public async Task<CloudBlockBlob> UploadAndSaveReportAsPDFToBlobAsync(Report report, EnumHelper.Reports reportName, string containerName)
{
    chpBlobContainer = blobClient.GetContainerReference(containerName);
    string blobName = Guid.NewGuid().ToString() + Path.GetExtension(reportName.GetDescription());
    // Retrieve reference to a blob. 
    CloudBlockBlob reportBlob = chpBlobContainer.GetBlockBlobReference(blobName);
    using (Stream stream = new MemoryStream())
    {
        try
        {
            report.Publish(stream, FileFormat.PDF);
        }
        catch(Exception ex)
        {
            //
        }

        await reportBlob.UploadFromStreamAsync(stream);
    }
    return reportBlob;
}

и это немного больше о сообщении об ошибке

Исключение при выполнении функции: Functions.ProcessQueueMessage Microsoft.Azure.WebJobs.Host.FunctionInvocationException: исключение при выполнении функции: Functions.ProcessQueueMessage ---> Microsoft.WindowsAzure.Storage.StorageException: удаленный сервер вернул ошибку: (400) Bad Request . ---> System.Net.WebException: удаленный сервер вернул ошибку: (400) неверный запрос. в Microsoft.WindowsAzure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException [T] (HttpStatusCode expectedStatusCode, HttpStatusCode actualStatusCode, T retVal, StorageCommandBase1 cmd, Exception ex) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\Common\Shared\Protocol\HttpResponseParsers.Common.cs:line 50 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.<>c__DisplayClass42.<PutBlobImpl>b__41(RESTCommand1 cmdResception \ Exttp \ workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Blob \ CloudBlockBlob.cs: строка 2339 в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse [T] (IAsyncResult getResponseResult) в c: \ Program Files (x86) \ Program Files workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Core \ Executor \ Executor.cs: строка 299 --- Конец внутренней трассировки стека исключений ---

У кого-нибудь есть совет?

Я обновил свой код подключения в конструкторе моей службы BLOB-объектов, теперь он выглядит так, но он по-прежнему не работает, и скрипач дает мне это

ПОДКЛЮЧИТЬ localhost: 10000 HTTP / 1.1 Host: localhost: 10000

HTTP / 1.1 200 Соединение установлено FiddlerGateway: Direct StartTime: 14: 23: 33.061 Соединение: закрыть EndTime: 14: 23: 33.063 ClientToServerBytes: 125 ServerToClientBytes: 505

но его http, мое соединение указано https, я все еще не мудрее

public BlobService()
    {
        var storageCredentials = new StorageCredentials("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
        var blobEndpoint = new Uri("https://localhost.fiddler:10000");
        var queueEndpoint = new Uri("https://localhost.fiddler:10001");
        var tableEndpoint = new Uri("https://localhost.fiddler:10002");
        var storageAccount = new CloudStorageAccount(storageCredentials, blobEndpoint, queueEndpoint, tableEndpoint, null);
        var blobClient = storageAccount.CreateCloudBlobClient();
        chpBlobContainer = blobClient.GetContainerReference("CHPReports");
        if (chpBlobContainer.CreateIfNotExists())
        {
            // Enable public access on the newly created "images" container.
            chpBlobContainer.SetPermissions(
                new BlobContainerPermissions
                {
                    PublicAccess = BlobContainerPublicAccessType.Blob
                });
        }
    }

person proteus    schedule 03.08.2017    source источник
comment
Какое на самом деле имя файла? Кроме того, есть ли исключения, которые вы проглатываете?   -  person Peter Bons    schedule 03.08.2017
comment
Я не вижу способа дать ему имя файла, поскольку он должен быть передан напрямую в лазурь и извлечен как pdf позже. Я даю ему уникальное имя на основе GUID и его описания. Нет никаких исключений   -  person proteus    schedule 03.08.2017
comment
как, черт возьми, кто-либо предназначен для отладки процесса, когда единственное сообщение об ошибке - Удаленный сервер возвратил ошибку: (400) Плохой запрос. ? Полностью в тупике здесь сейчас   -  person proteus    schedule 03.08.2017
comment
пробовали ли вы перехватить звонок (zappysys. com / blog /) в Fiddler, чтобы проанализировать ответ от Azure?   -  person alwayslearning    schedule 03.08.2017
comment
не мог заставить скрипач перехватить localhost, я искал решения в Google, но все они, похоже, связаны с изменением URL-адреса, и я не уверен, что это возможно при локальном использовании azure, я не контролирую URL-адрес   -  person proteus    schedule 03.08.2017
comment
отредактировал мои настройки подключения, но это не имело значения   -  person proteus    schedule 03.08.2017
comment
Что делает Publish? Возможно, вам нужно вернуться к началу потока?   -  person jle    schedule 03.08.2017
comment
Может кто-нибудь помочь мне здесь ? Я в полной растерянности и не могу продолжать эту работу. Я использовал этот образец проекта ContosoAdsWebJobsSDK для тестирования загрузки изображений в хранилище BLOB-объектов, и он отлично работает. Я просто продублировал код для потока памяти, код подключения такой же. Я даже попытался вернуться к v4.2.1.0 лазурного хранилища bsdk, но это не имело никакого значения.   -  person proteus    schedule 03.08.2017
comment
publish помещает отчет в поток и устанавливает его формат pdf. Я попытался установить для поиска потока значение 0, но сейчас он даже не зашел так далеко, он падает в конструкторе здесь if (chpBlobContainer.CreateIfNotExists ())   -  person proteus    schedule 03.08.2017
comment
как называется контейнер? это будет плохой запрос, если неверное имя контейнера   -  person jle    schedule 03.08.2017


Ответы (1)


Вы не можете использовать "CHPReports" в качестве имени контейнера, поскольку имя должно быть в нижнем регистре.

Убедитесь, что имя контейнера действительно:

Имя контейнера должно быть действительным DNS-именем, соответствующим следующим правилам именования: Имена контейнеров должны начинаться с буквы или цифры и могут содержать только буквы, цифры и дефис (-). Каждому тире (-) должно предшествовать сразу же после него буква или цифра; в именах контейнеров не допускаются следующие подряд дефисы. Все буквы в имени контейнера должны быть строчными. Имена контейнеров должны содержать от 3 до 63 символов.

person jle    schedule 03.08.2017
comment
Я только что узнал об этом! поместил ловушку ошибок вокруг бита CreateIfNotExists, и я получил следующее: «Указанное имя ресурса содержит недопустимые символы». затем я вспомнил о том, что в названии контейнера нельзя использовать символы верхнего регистра - person proteus; 03.08.2017
comment
это работает сейчас, это несколько часов моей жизни, я не вернусь! - person proteus; 03.08.2017