使用带有字节数组的PutBlock的EIPHTTPProtocolExceptionPeer异常全部设置为零

时间:2012-02-16 08:10:38

标签: delphi delphi-xe2 azure-storage-blobs

使用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引发异常类   EIPHTTPProtocolExceptionPeer,消息'HTTP / 1.1 403服务器失败   验证请求。确保授权的值   标题正确形成,包括签名。'。

但是,如果您更改 FillMemory 行,使其填充1(或任何除零),那么它可以正常工作。为什么呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

令人难以置信的是,问题似乎是 ttgbNgpWctgMJ0MPORU + LA ==

的块ID值

如果您将其用作块ID,则会出现该错误。