Det går inte att ladda upp blob- eller blockinnehåll i Azure Blob Storage
Den här artikeln beskriver hur du löser fel som kan uppstå när du använder Microsoft Azure Blob Storage tillsammans med dina molnprogram för att ladda upp blob- eller blockinnehåll.
Förutsättningar
- Ett lagringskonto från någon av följande lagringstjänster:
- Azure Storage SDK
- Azure Lagringsutforskaren
- PowerShell
Symptom
Du får något av följande felmeddelanden.
Felkod | Felmeddelande |
---|---|
BlockCountExceedsLimit |
"Det ogenomförda blockantalet får inte överskrida den maximala gränsen på 100 000 block." |
InvalidBlobOrBlock |
"Det angivna blob- eller blockinnehållet är ogiltigt." |
InvalidBlock eller InvalidBlockList |
"Den angivna blocklistan är ogiltig." |
Orsak 1: Blocklängden som angavs i Put Block-anropet är inte giltig
Blocklängden som angavs i Put Block URI-begäran är inte giltig av en eller flera av följande orsaker:
Programmet eller klienten har angett en blockstorlek som inte stöds.
Blockets storlek är större än den maximala tillåtna blockstorleken. Information om hur du hittar blockstorleksgränserna för olika versioner av BLOB Service REST API finns i avsnittet Anmärkningar i referensartikeln "Placera block".
När du försökte ladda upp datablock med hjälp av mer än ett program fanns det icke-utelämnade block som hade inkonsekventa blocklängder. Den här situationen beror på att olika program använder olika längder för att ladda upp data, eller på att en tidigare uppladdning misslyckades.
Blobben har för många ogenomförda block eftersom en tidigare uppladdningsåtgärd avbröts. Det maximala antalet obekräftade block som kan associeras med en blob är 100 000.
Ta bort de obekräftade blocken genom att implementera någon av dessa lösningar.
Lösning 1: Vänta tills skräpinsamlingen har hämtat de data som inte har hämtats
Vänta sju dagar tills listan över ej tillåtna block rensas av skräpinsamling.
Lösning 2: Använd en dummyblob för att göra dataöverföringen
Använd Azure Storage SDK för att överföra data med hjälp av en dummyblob. För att göra detta följer du stegen nedan:
Skapa en dummyblob som har samma blobnamn och som finns i samma container. Den här bloben kan ha en längd på noll.
Överför bloben med hjälp av en avblockerad överföring.
Lösning 3: Checka in listan över ej tillåtna block med hjälp av Azure Storage SDK
Använd Azure Storage SDK för att checka in listan över ej tillåtna block och rensa bloben. För att göra detta följer du stegen nedan:
Hämta listan över ej tillåtna block genom att göra en URI-begäran för Hämta blockeringslista där
blocklisttype
URI-parametern är inställd påuncommitted
.Checka in blockeringslistan med hjälp av URI-begäran för Put Block List .
Ta bort bloben.
Följande PowerShell-funktion är ett exempel på hur du hämtar en ej bekräftad blocklista och sedan tar bort den. Funktionen kräver följande parametrar.
Parameternamn | Beskrivning |
---|---|
-StorageAccountName |
Namnet på lagringskontot. |
-SharedAccessSignature |
En SAS-token (signatur för delad åtkomst) som använder URI-parametrarna <ss=b;srt=sco;sp=rwldc> . De här parametrarna beskrivs i Skapa en SAS-konto-URI. |
-ContainerName |
Namnet på lagringscontainern. |
-BlobName |
Namnet på bloben. |
[CmdletBinding()] Param(
[Parameter(Mandatory=$true, Position=1)] [string] $StorageAccountName,
[Parameter(Mandatory=$True, Position=1)] [string] $SharedAccessSignature,
[Parameter(Mandatory=$True, Position=1)] [string] $ContainerName,
[Parameter(Mandatory=$True, Position=1)] [string] $BlobName
)
# Build the URI strings in the REST API for GET and DELETE.
$uriDelete = (
"https://$StorageAccountName.blob.core.windows.net/",
"$ContainerName",
"/",
"$BlobName",
"$SharedAccessSignature"
) -Join ""
$uriGet = (
"$uriDelete",
"&comp=blocklist",
"&blocklisttype=uncommitted"
) -Join ""
Write-Host "The Delete URI is $uriDelete."
Write-Host "The Get URI is $uriGet."
# Make a REST API call to get the uncommitted block list.
$listFileURI = Invoke-WebRequest -Uri $uriGet -Method Get
$FileSystemName = $listFileURI.Content
$String = $FileSystemName -replace '' , ''
$String |
Select-Xml –XPath "/BlockList/UncommittedBlocks/Block" |
Select-Object -Expand Node
$Count = $String.Count
# Delete the blob and the uncommitted block.
if ($Count.Count -gt 0) {
$listFileURI1 = Invoke-WebRequest -Uri $uriDelete -Method Delete
$FileSystemName1 = $listFileURI1.StatusCode
Write-Host "The deletion was successful. The API returned status code $FileSystemName1."
}
Write-Host "Check whether the uncommitted blocks are still present."
Try {
$listFileURI2 = Invoke-WebRequest -Uri $uriGet -Method Get
} Catch {
# $err = $_.Exception
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
}
Write-Host (
"In this error message, we can verify that the",
"uncommitted blocks and their respective blob have been deleted.",
"The name and size of the uncommitted blocks that have been deleted are shown."
)
Orsak 2: PUT-åtgärder utförs samtidigt för en blob
Ett tids- eller samtidighetsproblem uppstår. Detta gör att flera PUT-åtgärder (Put Block) inträffar ungefär samtidigt för en enda blob. Åtgärden Put Block List skriver en blob genom att ange listan över block-ID:t som utgör bloben. För att kunna skrivas som en del av en blob måste ett block ha skrivits till servern i en tidigare Put Block-åtgärd .
Kommentar
Det här felet kan inträffa vid samtidiga överföringsöverföringar när du har startat uppladdningen men innan du checkar in. I det här fallet misslyckas uppladdningen. Programmet kan försöka ladda upp igen när felet inträffar, eller prova en annan återställningsåtgärd som baseras på det scenario som krävs.
Lösning: Använda lån
I stället för att använda optimistisk samtidighet kan du försöka implementera pessimistisk samtidighet (lån) med hjälp av Azure Storage SDK eller ett GUI-baserat verktyg, till exempel Azure Storage Explorer. Mer information om optimistisk och pessimistisk samtidighet finns i Hantera samtidighet i bloblagring.
Om felet orsakas av samtidighetsproblem kan du också behöva rensa de icke-utelämnade blocken genom att följa någon av lösningarna i Orsak 1.
Kontakta oss för att få hjälp
Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.