2016-12-29 12 views
0

私のオートメーションプロセスでコレクションを削除する必要があります。 以下のスクリプトを実行しようとしています。操作はうまく動作しますが、削除操作は "(401)無保護"エラーで失敗しました。それは奇妙な理由ですDeleteコレクションは、追加のヘッダーを必要としません。誰かがヒントを与えることができます、何が間違っていますか?Azure DocumentDB Rest API PowerShellコレクションコレクション401無菌

$accountName = 'someaccountname' 
$connectionKey = 'masterkey' 
$collectionName = 'mycollection' 
$databaseName = 'mydatabase' 

function GetKey([System.String]$Verb = '',[System.String]$ResourceId = '', 
     [System.String]$ResourceType = '',[System.String]$Date = '',[System.String]$masterKey = '') { 
    $keyBytes = [System.Convert]::FromBase64String($masterKey) 
    $text = @($Verb.ToLowerInvariant() + "`n" + $ResourceType.ToLowerInvariant() + "`n" + $ResourceId + "`n" + $Date.ToLowerInvariant() + "`n" + "`n") 
    $body =[Text.Encoding]::UTF8.GetBytes($text) 
    $hmacsha = new-object -TypeName System.Security.Cryptography.HMACSHA256 -ArgumentList (,$keyBytes) 
    $hash = $hmacsha.ComputeHash($body) 
    $signature = [System.Convert]::ToBase64String($hash) 
    [System.Web.HttpUtility]::UrlEncode($('type=master&ver=1.0&sig=' + $signature)) 
} 
function BuildHeaders([string]$action = "get",[string]$resType, [string]$resourceId){ 
    $authz = GetKey -Verb $action -ResourceType $resType -ResourceId $resourceId -Date $apiDate -masterKey $connectionKey 
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
    $headers.Add("Authorization", $authz) 
    $headers.Add("x-ms-version", '2015-12-16') 
    $headers.Add("x-ms-date", $apiDate) 
    $headers 
} 
function GetUTDate() { 
    $date = get-date 
    $date = $date.ToUniversalTime(); 
    return $date.ToString("r", [System.Globalization.CultureInfo]::InvariantCulture); 
} 
function GetDatabases() { 
    $uri = $rootUri + "/dbs" 
    $hdr = BuildHeaders -resType dbs 
    $response = Invoke-RestMethod -Uri $uri -Method Get -Headers $hdr 
    $response.Databases 
    Write-Host ("Found " + $Response.Databases.Count + " Database(s)") 
} 
function GetCollections([string]$dbname){ 
    $uri = $rootUri + "/" + $dbname + "/colls" 
    $hdr = BuildHeaders -resType colls -resourceId $dbname 
    $response = Invoke-RestMethod -Uri $uri -Method Get -Headers $hdr 
    $response.DocumentCollections 
    Write-Host ("Found " + $Response.DocumentCollections.Count + " DocumentCollection(s)") 
} 
function DeleteCollection([string]$dbname){ 
    $uri = $rootUri + "/" + $dbname + "/colls" + "/" + $collectionName 
    $hdrs = BuildHeaders -action DELETE -resType colls -resourceId $collectionName 
    $response = Invoke-RestMethod -Uri $uri -Method Delete -Headers $hdrs 
    Write-Host "DELETE $uri" 
} 
$rootUri = "https://" + $accountName + ".documents.azure.com" 
write-host ("Root URI is " + $rootUri) 

#validate arguments 
$apiDate = GetUTDate 
$db = GetDatabases | where { $_.id -eq $databaseName } 

if ($db -eq $null) { 
    write-error "Could not find database in account" 
    return 
} 

$dbname = "dbs/" + $databaseName 
$collection = GetCollections -dbname $dbname | where { $_.id -eq $collectionName } 

if($collection -eq $null){ 
    write-error "Could not find collection in database" 
    return 
} 
Write-Host 
$Delete = DeleteCollection -dbname $dbname | where { $_.id -eq $collectionName } 

答えて

1

通常、Authorizationまたはx-ms-dateヘッダーが設定されていないか(または無効な許可トークンを持つAuthorizationヘッダー)、401 unauthorized errorが返されます。私は、要求をキャプチャして応答をチェックするためにfiddlerを使用し、Authorizationとx-ms-dateヘッダーの両方が設定されていることがわかります。したがって、Authorizationヘッダーが無効な認証トークンに設定されているようです。あなたのコードに基づいて、私はいくつかの変更を行い、関数は私の側で正常に動作する可能性があります。

function DeleteCollection([string]$dbname){ 
    $uri = $rootUri + "/" + $dbname + "/colls" + "/" + $collectionName 
    $collectionName = $dbname + "/colls" + "/" + $collectionName 
    $hdrs = BuildHeaders -action DELETE -resType colls -resourceId $collectionName 
    #Write-Host "resourceId $collectionName" 
    $response = Invoke-RestMethod -Uri $uri -Method Delete -Headers $hdrs 
    Write-Host "resource $collectionName" 
    Write-Host "DELETE $uri" 
} 

$ COLLECTIONNAMEdbs/{yourdbname}/colls/{yourcollectionname}

enter image description here

+0

する必要がありますあなたにたくさんありがとうございました。それは働いている。 –

1

これは、保留中の操作がある場合に発生します。成功するまで再試行するか、または削除する前に遅延を追加してください。私たちのために、半分は、これをもう一度見ないことを保証するのに十分です。