Delen via


Het uploaden van blob- of blokinhoud mislukt in Azure Blob Storage

In dit artikel wordt beschreven hoe u fouten kunt oplossen die kunnen optreden wanneer u Microsoft Azure Blob Storage samen met uw cloudtoepassingen gebruikt om blob- of blokinhoud te uploaden.

Voorwaarden

Symptomen

U ontvangt een van de volgende foutberichten.

Foutcode Foutmelding
BlockCountExceedsLimit "Het aantal niet-verzonden blokken mag niet groter zijn dan de maximumlimiet van 100.000 blokken."
InvalidBlobOrBlock "De opgegeven blob- of blokinhoud is ongeldig."
InvalidBlock of InvalidBlockList "De opgegeven bloklijst is ongeldig."

Oorzaak 1: De bloklengte die is opgegeven in de aanroep Put Block is niet geldig

De bloklengte die is opgegeven in de Put Block URI-aanvraag, is om een of meer van de volgende redenen niet geldig:

  • De toepassing of client heeft een blokgrootte opgegeven die niet wordt ondersteund.

  • De grootte van het blok is groter dan de maximaal toegestane blokgrootte. Als u de limieten voor blokgrootten voor verschillende versies van de Blob Service REST API wilt vinden, raadpleegt u de sectie Opmerkingen van het naslagartikel Put Block.

  • Toen u probeerde blokken met gegevens te uploaden met behulp van meer dan één toepassing, waren er niet-doorgevoerde blokken met inconsistente bloklengten. Deze situatie treedt op omdat verschillende toepassingen verschillende lengten gebruiken om gegevens te uploaden of omdat een vorige upload is mislukt.

  • De blob bevat te veel niet-doorgevoerde blokken omdat een vorige uploadbewerking is geannuleerd. Het maximum aantal niet-verzonden blokken dat kan worden gekoppeld aan een blob is 100.000.

Verwijder de niet-doorgevoerde blokken door een van deze oplossingen te implementeren.

Oplossing 1: Wacht tot de garbagecollection de niet-verzonden gegevens heeft opgehaald

Wacht zeven dagen totdat de niet-verzonden bloklijst door garbagecollection is opgeschoond.

Oplossing 2: Een dummy-blob gebruiken om de gegevensoverdracht te maken

Gebruik de Azure Storage SDK om de gegevens over te dragen met behulp van een dummy-blob. Hiervoor volgt u deze stappen:

  1. Maak een dummy-blob met dezelfde blobnaam en bevindt zich in dezelfde container. Deze blob kan een lengte van nul hebben.

  2. De blob overdragen met behulp van een niet-geblokkeerde overdracht.

Oplossing 3: De niet-verzonden bloklijst doorvoeren met behulp van de Azure Storage SDK

Gebruik de Azure Storage SDK om de niet-doorgevoerde bloklijst door te voeren en de blob op te schonen. Hiervoor volgt u deze stappen:

  1. Haal de niet-verzonden bloklijst op door een URI-aanvraag voor get block list te maken waarin de blocklisttype URI-parameter is ingesteld op uncommitted.

  2. Voer de bloklijst door met behulp van de URI-aanvraag Put Block List .

  3. Verwijder de blob.

De volgende PowerShell-functie is een voorbeeld van het ophalen van een niet-doorgevoerde bloklijst en deze vervolgens verwijderen. Voor de functie zijn de volgende parameters vereist.

Parameternaam Beschrijving
-StorageAccountName De naam van het opslagaccount.
-SharedAccessSignature Een SAS-token (Shared Access Signature) dat gebruikmaakt van de URI-parameters <ss=b;srt=sco;sp=rwldc>. Deze parameters worden beschreven in Construct an account SAS URI.
-ContainerName De naam van de opslagcontainer.
-BlobName De naam van de blob.
[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."
)

Oorzaak 2: PUT-bewerkingen worden gelijktijdig uitgevoerd voor een blob

Er treedt een timing- of gelijktijdigheidsprobleem op. Hierdoor worden meerdere PUT-bewerkingen (Put Block) op ongeveer hetzelfde moment uitgevoerd voor één blob. Met de bewerking Bloklijst plaatsen wordt een blob geschreven door de lijst met blok-id's op te geven waaruit de blob bestaat. Als u wilt schrijven als onderdeel van een blob, moet een blok in een eerdere putblokbewerking naar de server zijn geschreven.

Notitie

Deze fout kan optreden tijdens gelijktijdige uploaddoorvoeringen nadat u de upload hebt gestart, maar voordat u doorvoert. In dit geval mislukt het uploaden. De toepassing kan het uploaden opnieuw proberen wanneer de fout optreedt of kan een andere herstelactie proberen die is gebaseerd op het vereiste scenario.

Oplossing: Leases gebruiken

In plaats van optimistische gelijktijdigheid te gebruiken, probeert u pessimistische gelijktijdigheid (leases) te implementeren met behulp van de Azure Storage SDK of een hulpprogramma op basis van een GUI, zoals Azure Storage Explorer. Zie Gelijktijdigheid beheren in blobopslag voor meer informatie over optimistische en pessimistische gelijktijdigheid.

Als de fout wordt veroorzaakt door gelijktijdigheidsproblemen, moet u mogelijk ook de niet-doorgevoerde blokken opschonen door een van de oplossingen in Oorzaak 1 te volgen.

Contacteer ons voor hulp

Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.