将MemoryStream保存到Azure blob存储

时间:2017-08-03 10:27:46

标签: c# azure memorystream azure-blob-storage

我正在使用Infragistics报告系统将报告创建为PDF并将其保存到Azure Blob存储,但我无法使其工作。我生成报告作为报告对象没有任何问题。该对象有一个名为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 ---&gt; Microsoft.WindowsAzure.Storage.StorageException:远程服务器返回错误:(400)错误请求。 ---&GT; 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 cmd,HttpWebResponse resp,Exception ex,OperationContext ctx)在c:\ Program中文件(x86)\ Jenkins \ workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Blob \ CloudBlockBlob.cs:第2339行      在Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse [T](IAsyncResult getResponseResult)中的c:\ Program Files(x86)\ Jenkins \ workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Core \ Executor \ Executor.cs:line 299      ---内部异常堆栈跟踪结束---

有人有什么建议吗?

我已经在我的blob服务的构造函数上更新了我的连接代码,它现在看起来像这样,但它仍然不起作用,fiddler给了我这个

CONNECT localhost:10000 HTTP / 1.1 主持人:localhost:10000

建立HTTP / 1.1 200连接 FiddlerGateway:直接 StartTime:14:23:33.061 连接:关闭 结束时间: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
                });
        }
    }

1 个答案:

答案 0 :(得分:2)

您不能将“CHPReports”用作容器名称,因为名称必须小写。

确保容器名称为valid

  

容器名称必须是有效的DNS名称,符合以下条件   命名规则:容器名称必须以字母或数字开头,并且   只能包含字母,数字和短划线( - )字符。一切   短划线( - )字符必须紧跟在前面和后面   字母或数字;容器中不允许连续破折号   名。容器名称中的所有字母必须为小写。容器   名称长度必须为3到63个字符。