2012-02-16 28 views
2

使用Delphi XE2更新3我有一個問題上傳一個零字節的塊到Azure的問題。當我說零字節時,我的意思是一個字節數組,每個元素設置爲零(它不是零長度)。EIPHTTPProtocolExceptionPeer異常使用PutBlock與字節數組全部設置爲零

例如:

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:

項目PROJECT1.EXE凸起異常類 EIPHTTPProtocolExceptionPeer與消息「HTTP /1.1 403服務器失敗 驗證請求。確保授權 標題的值正確地形成,包括簽名。'。

但是,如果你改變了FillMemory線,使之與1(或什麼,但零)填充它,然後它沒有錯誤。爲什麼?

感謝您的任何幫助。

回答

1

令人難以置信的是,似乎這個問題是ttgbNgpWctgMJ0MPORU + LA ==

如果你把它作爲一個模塊ID,那麼你得到這個錯誤的塊ID值。

+0

實際上,它是TCloudService.URLEncodeValue()中的一個錯誤。它應該沒有URL編碼加號(+)。 – Mick 2012-02-28 14:38:50

相關問題