2017-06-05 5 views
4

Ich benutze dieses Skript aus dem Download in diesem Link. https://gallery.technet.microsoft.com/scriptcenter/How-to-query-Azure-Cosmos-0a9aa517 Allerdings bekomme ich aus irgendeinem Grund eine 404-Antwort.Getting 404 auf Powershell-Abfrage von Cosmos DB

Ich kopierte die URL der db direkt. Wenn Sie eine falsche URL eingeben, wird der Fehler "konnte nicht aufgelöst werden" angezeigt, sodass ich weiß, dass der Standort existiert.

Basierend auf der Azure CosmosDB API-Dokumentation hier: https://docs.microsoft.com/en-us/rest/api/documentdb/databases die $ DatabaseID benutzer gesetzt und hat nur eindeutig sein, also habe ich stellte es die gleiche wie die DB-Name und die URL, die zugeordnet werden .

Ändern, um anders zu sein, gibt mir immer noch die gleiche 404 Antwortnachricht (unten).

Edit: Entfernt Original kommentieren Intro zur besseren Lesbarkeit

Powershell-Skript:

# add necessary assembly 
# 
Add-Type -AssemblyName System.Web 

# generate authorization key 
Function Generate-MasterKeyAuthorizationSignature 
{ 
    [CmdletBinding()] 
    Param 
    (
     [Parameter(Mandatory=$true)][String]$verb, 
     [Parameter(Mandatory=$true)][String]$resourceLink, 
     [Parameter(Mandatory=$true)][String]$resourceType, 
     [Parameter(Mandatory=$true)][String]$dateTime, 
     [Parameter(Mandatory=$true)][String]$key, 
     [Parameter(Mandatory=$true)][String]$keyType, 
     [Parameter(Mandatory=$true)][String]$tokenVersion 
    ) 

    $hmacSha256 = New-Object System.Security.Cryptography.HMACSHA256 
    $hmacSha256.Key = [System.Convert]::FromBase64String($key) 

    $payLoad = "$($verb.ToLowerInvariant())`n$($resourceType.ToLowerInvariant())`n$resourceLink`n$($dateTime.ToLowerInvariant())`n`n" 
    $hashPayLoad = $hmacSha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($payLoad)) 
    $signature = [System.Convert]::ToBase64String($hashPayLoad); 

    [System.Web.HttpUtility]::UrlEncode("type=$keyType&ver=$tokenVersion&sig=$signature") 
} 

# query 
Function Query-CosmosDb 
{ 
    [CmdletBinding()] 
    Param 
    (
     [Parameter(Mandatory=$true)][String]$EndPoint, 
     [Parameter(Mandatory=$true)][String]$DataBaseId, 
     [Parameter(Mandatory=$true)][String]$CollectionId, 
     [Parameter(Mandatory=$true)][String]$MasterKey, 
     [Parameter(Mandatory=$true)][String]$Query 
    ) 

    $Verb = "POST" 
    $ResourceType = "docs"; 
    $ResourceLink = "dbs/$DatabaseId/colls/$CollectionId" 

    $dateTime = [DateTime]::UtcNow.ToString("r") 
    $authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime 
    $queryJson = @{query=$Query} | ConvertTo-Json 
    $header = @{authorization=$authHeader;"x-ms-documentdb-isquery"="True";"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime} 
    $contentType= "application/json "# The original said "application/query+json", I tried both 
    $queryUri = "$EndPoint$ResourceLink/docs" 

    $result = Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $queryJson 

    $result | ConvertTo-Json -Depth 10 
} 

# fill the target cosmos database endpoint uri, database id, collection id and masterkey 

$DatabaseName = "" # name goes here 
$MasterKey = "" #key goes here 
$CollectionId = "transientUsers" 

$DatabaseId = $DatabaseName 
$CosmosDBEndPoint = "https://$DatabaseId.documents.azure.com:443/" 

# query string 
$Query = "SELECT * FROM transientUsers" 

# execute 
Query-CosmosDb -EndPoint $CosmosDBEndPoint -DataBaseId $DataBaseId -CollectionId $CollectionId -MasterKey $MasterKey -Query $Query 

Fehler Ich erhalte:

Invoke-RestMethod : The remote server returned an error: (404) Not Found. 
At D:\querycosmos\PowerShell\QueryCosmosDB.ps1:69 char:12 
+ ... $result = Invoke-RestMethod -Method $Verb -ContentType $contentType ... 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException 
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand 

Antwort

1

ich bemerken, dass Sie $DatabaseId an zwei Stellen verwendet:

$ResourceLink = "dbs/$DatabaseId/colls/$CollectionId" 

und

$CosmosDBEndPoint = "https://$DatabaseId.documents.azure.com:443/" 

Wenn $DatabaseId auf Ihren Kontonamen bezieht, dann müßten Sie Ihre $ResourceLink Variablen ändern und den Namen der Datenbank in Ihrem Konto enthält die Sammlung verwenden. Wenn sich jedoch $DatabaseId auf den Namen der Datenbank bezieht, müssen Sie $CosmosDBEndPoint ändern und dort den Kontonamen verwenden.

+0

Hallo Gaurav Mantri, danke für deine Antwort. Auf welchen Kontonamen beziehen Sie sich? Ich dachte zuerst, du meintest das azurblaue Abonnement? – tamarack

+0

Bitte beachten Sie: https://docs.microsoft.com/en-us/azure/cosmos-db/create-documentdb-dotnet#create-a-database-account. Mit Kontoname meine ich "ID" in der Verknüpfung erwähnt. –

+0

Danke, ich habe es hinzugefügt, irgendwie immer noch den gleichen Fehler mit dem 404 obwohl. – tamarack

Verwandte Themen