delphi - 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

标签 delphi delphi-xe2 azure-blob-storage

使用 Delphi XE2 Update 3 我在将零字节 block 上传到 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 raised exception class EIPHTTPProtocolExceptionPeer with message 'HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.'.

但是,如果您更改 FillMemory 行,使其用 1(或除零以外的任何值)填充,则它可以正常工作而不会出现错误。为什么?

感谢您的帮助。

最佳答案

令人难以置信的是,问题似乎出在ttgbNgpWctgMJ0MPORU+LA==的区 block ID值

如果您将其用作 block ID,则会收到该错误。

关于delphi - 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307637/

相关文章:

delphi - 弹出菜单标题中的非拉丁字符

azure - 使用 MemoryStream 反序列化大块 blob

azure - 是否可以及时将文件和文件夹从 FTP 发送到 Azure Blob 存储?

delphi - 如何*正确地*找出 Delphi XE2 上的目录是否存在?

python - 访问 Python Azure Function 中的绑定(bind)表达式值

delphi - delphi字符串以处理类型转换

Delphi:使用 RTTI 实例化的对象未调用重写方法

delphi - 如何在调用Web服务期间防止对话框(基本身份验证提示)

windows - 如何在不禁用子控件功能的情况下从其客户区拖动我的表单?

delphi - TRichEdit 控件中的分页符