使用putblock带有一个字节数组的eiphttpprotocolexceptionpeer异常
-
25-10-2019 - |
题
使用Delphi XE2 Update 3,我在将零字节的块上载到Azure时遇到了问题。当我说零字节时,我的意思是一个字节数组,每个元素设置为零(不是零长度)。
例如:
var
ConInfo: TAzureConnectionInfo;
RespInfo: TCloudResponseInfo;
BlobService: TAzureBlobService;
Content: TBytes;
MD5: String;
Hasher: TIdHashMessageDigest5;
begin
ConInfo:=TAzureConnectionInfo.Create(self);
ConInfo.AccountName:='YOUR ACCOUNT NAME';
ConInfo.AccountKey:='YOUR ACCOUNT KEY';
ConInfo.Protocol:='http';
BlobService:=TAzureBlobService.Create(ConInfo);
RespInfo:=TCloudResponseInfo.Create;
SetLength(Content, 1048576); // 1 MByte
FillMemory(@Content[0], 1048576, 0); // << --- fill it with anything except 0 and it works
Hasher:=TIdHashMessageDigest5.Create;
MD5:=Data.Cloud.CloudAPI.EncodeBytes64(Hasher.HashBytes(Content));
Hasher.Free;
BlobService.PutBlock('CONTAINER NAME', 'BLOB NAME', MD5, Content, MD5, '', RespInfo);
如果运行上述代码,则在putblock的呼叫上提出了一个异常:
Project Project1.exe提出了带有消息'http/1.1 403服务器的EIPHTTPPROTOCOLEXPECTIONPEER类Eiphttpprotocolexceptionpeer未能对请求进行身份验证。确保正确形成授权标头的值,包括签名。'。
但是,如果您更改 Fillmemory 行以使其充满1(或零以外的其他任何东西),然后它可以无错误地工作。为什么?
谢谢你的帮助。
解决方案
令人难以置信的是,问题似乎是 ttgbngpwctgmj0mporu+la ==
如果将其用作块ID,则会获得该错误。
不隶属于 StackOverflow