2017-06-05 8 views
4

私はこのリンクのダウンロードからこのスクリプトを使用しています。 https://gallery.technet.microsoft.com/scriptcenter/How-to-query-Azure-Cosmos-0a9aa517 何らかの理由で私は404応答を得ています。Powershellで404を取得するコスモスのクエリDB

私はdbのURLを直接コピーしました。偽のURLを入力すると、「解決できませんでした」というエラーが表示され、その場所が存在することがわかります。ここAzureのCosmosDB APIドキュメントに基づいて

https://docs.microsoft.com/en-us/rest/api/documentdb/databases $ databaseIDは、ユーザー設定で、ちょうどユニークである必要がありますので、私はそれがデータベース名と同じになるように設定し、URLにすることを割り当てられました。

これを変更すると、同じ404応答メッセージ(以下)が表示されます。

編集:私は取得しています

# 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 

エラー:読みやす

PowerShellのスクリプトのために取り外さオリジナルコメントイントロ

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 

答えて

1

私はあなたが2つの場所で$DatabaseIdを使用していることに気づい:

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

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

$DatabaseIdは、あなたのアカウント名を参照する場合は、あなたの$ResourceLink変数を変更し、コレクションを含むアカウント内のデータベースの名前を使用する必要があります。しかし$DatabaseIdがデータベース名を参照している場合は、$CosmosDBEndPointを変更してそこにアカウント名を使用する必要があります。

+0

こんにちはGauravマントリ、ご回答いただきありがとうございます。 どのアカウント名を参照していますか? 私は当初、紺碧の定期購読を意味すると思いましたか? – tamarack

+0

こちらをご覧ください:https://docs.microsoft.com/en-us/azure/cosmos-db/create-documentdb-dotnet#create-a-database-accountアカウント名では、リンクに記載されている「ID」を意味します。 –

+0

ありがとう、私はそれを追加した、何とか404と同じエラーがまだ得ている。 – tamarack

関連する問題