Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cosmos DB的Powershell查询中获取404_Powershell_Azure_Azure Cosmosdb - Fatal编程技术网

在Cosmos DB的Powershell查询中获取404

在Cosmos DB的Powershell查询中获取404,powershell,azure,azure-cosmosdb,Powershell,Azure,Azure Cosmosdb,我正在使用此链接中下载的脚本。 然而由于某种原因,我得到了404的回复 我直接复制粘贴了数据库的url。输入一个假URL会给我一个“无法解决”的错误,所以我知道该位置存在 基于以下Azure CosmosDB API文档: $databaseID是用户设置的,必须是唯一的,所以我将其设置为与db名称相同,并将其分配给url 将其更改为不同,仍然会给我相同的404响应消息(如下所示) 编辑:为了可读性,删除了原始评论介绍 Powershell脚本: # add necessary assembly

我正在使用此链接中下载的脚本。 然而由于某种原因,我得到了404的回复

我直接复制粘贴了数据库的url。输入一个假URL会给我一个“无法解决”的错误,所以我知道该位置存在

基于以下Azure CosmosDB API文档: $databaseID是用户设置的,必须是唯一的,所以我将其设置为与db名称相同,并将其分配给url

将其更改为不同,仍然会给我相同的404响应消息(如下所示)

编辑:为了可读性,删除了原始评论介绍

Powershell脚本:

# 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
我得到的错误是:

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

我注意到您在两个地方使用了
$DatabaseId

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


如果
$DatabaseId
引用了您的帐户名,则需要更改
$ResourceLink
变量,并使用包含集合的帐户内的数据库名。但是,如果
$DatabaseId
引用了数据库名称,那么您需要更改
$CosmosDBEndPoint
并在那里使用帐户名。

您好,Gaurav Mantri,感谢您的回复。您指的是哪个帐户名?我最初以为你指的是azure订阅?请看以下内容:。我所说的帐户名是指链接中提到的
ID
。谢谢,我添加了它,但不知何故,404仍然会出现同样的错误。
$CosmosDBEndPoint = "https://$DatabaseId.documents.azure.com:443/"