Dela via


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

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 blockstorleksbegränsningar för olika versioner av REST-API:et för Blob Service 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 obekräftade 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.

  • Bloben har för många obekräftade 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 ogenomförda data

Vänta i sju dagar på att den ogenomförda blocklistan ska 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. Gör så här:

  1. Skapa en dummyblob som har samma blobnamn och finns i samma container. Den här blobben kan ha en längd på noll.

  2. Överför bloben med hjälp av en avblockerad överföring.

Lösning 3: Checka in den obekräftade blockeringslistan med hjälp av Azure Storage SDK

Använd Azure Storage SDK för att checka in den ogenomförda blocklistan och rensa bloben. Gör så här:

  1. Hämta den ogenomförda blocklistan genom att göra en URI-begäran för Hämta blockeringslista där blocklisttype URI-parametern är inställd på uncommitted.

  2. Checka in blockeringslistan med hjälp av URI-begäran put block list .

  3. Ta bort bloben.

Följande PowerShell-funktion är ett exempel på hur du hämtar en ogenomförd blockeringslista 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>. Dessa parametrar beskrivs i Skapa en SAS-URI för ett konto.
-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 problem med tids- eller samtidighet inträffar. Detta gör att flera PUT-åtgärder (Put Block) utförs ungefär samtidigt för en enda blob. Åtgärden Placera blockeringslista 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 .

Obs!

Det här felet kan inträffa under samtidiga överföringsincheckningar 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 ogenomförda 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.