使用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,则会获得该错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top