Я использую систему отчетов 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, StorageCommandBase
1 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(RESTCommand
1 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
});
}
}