我正在使用后端Web api ASP.NET CORE 2.1和前端angular 6开发一个网站。
在此站点中,我正在通过microsoft.azure.storage 9.3.2通过Web API集成大文件的上传。我正在按块进行分块,然后将它们从FE发送到端点。在内部执行以下逻辑:
var container = CloudStorageAccount.Parse(key).CreateCloudBlobClient().GetContainerReference(containerName);
var result = await container.CreateIfNotExistsAsync();
if (result)
{
await container.SetPermissionsAsync(new BlobContainerPermissions
{
PublicAccess = BlobContainerPublicAccessType.Blob
});
}
BlockBlob = container.GetBlockBlobReference(blobName);
await fileUploadSession.BlockBlob.PutBlockAsync(block.BlockId, chunkStream, null);
这里我有一个例外,说“ HTTP标头之一的值格式不正确。”
stackTrace是:
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.d__4`1.MoveNext()在C:\ Program Files(x86)\ Jenkins \ workspace \ release_dotnet_master \ Lib \ WindowsRuntime \ Core \ Executor \ Executor.cs中:316行 ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.d__62.MoveNext()中的C:\ Program Files(x86)\ Jenkins \ workspace \ release_dotnet_master \ Lib \ WindowsRuntime \ Blob \ CloudBlockBlob.cs:line 1020 ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在D:\ repos \ vidiwin2api \ vidiwin2Api \ Controllers \ VideosController.cs:line 469中的vidiwin2Api.Controllers.VideosController.d__18.MoveNext()中
最令人惊讶的是,我在较早版本中具有相同的功能,并在Framework 4.6和microsoft.azure.storage 6.0.0上使用了BE Web api,并且可以正常工作!
我已经在PutBlockAsync中测试了所有类型的参数,并且始终具有相同的异常。
有人可以帮我吗?
答案 0 :(得分:2)
我遇到了同样的错误,因为在调用PutBlockAsync()之前忘记将流位置重置为0。试试
chunkStream.Position = 0;
await fileUploadSession.BlockBlob.PutBlockAsync(block.BlockId, chunkStream, null);
否则,请检查Exception上的ExtendedErrorInformation属性。在那里,您会找到有关错误的HTTP标头的其他信息。