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
Azure “如何修复”;401“未经授权”;PUT Invoke RestMethod中出错(尝试替换存储过程)_Azure_Azure Cosmosdb_Azure Powershell - Fatal编程技术网

Azure “如何修复”;401“未经授权”;PUT Invoke RestMethod中出错(尝试替换存储过程)

Azure “如何修复”;401“未经授权”;PUT Invoke RestMethod中出错(尝试替换存储过程),azure,azure-cosmosdb,azure-powershell,Azure,Azure Cosmosdb,Azure Powershell,我正在尝试使用RESTAPI和PowerShell管理CosmosDB资源。 当我使用GET和POST时,我的代码工作正常,但当我尝试使用PUT替换现有对象时,我得到了401错误 我的代码在存储过程不存在时注册它,并在SP已经存在时更新它 因此,在创建新SP时,我使用以下变量: $Verb = "POST" $ResourceType = "sprocs" $ResourceLink = "dbs/$DBName/colls/$CollName" $queryUri = "$CosmosDBEn

我正在尝试使用RESTAPI和PowerShell管理CosmosDB资源。 当我使用GET和POST时,我的代码工作正常,但当我尝试使用PUT替换现有对象时,我得到了401错误

我的代码在存储过程不存在时注册它,并在SP已经存在时更新它

因此,在创建新SP时,我使用以下变量:

$Verb = "POST"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType"
获取身份验证标头:

...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime

然后调用REST方法:

$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime} 
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body
它工作得很好,创造了它应该创造的东西。 而且,当我需要替换现有对象(在我的例子中是SP)时,我会像这样更改变量:

$Verb = "PUT"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$ItemName = "SP_Name"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType/$ItemName"
生成auth头,就像使用POST时一样(只有动词不同):

以及使用新URI调用REST方法(现在包括要更改的SP的名称):


这使我
401未经授权
,所以似乎auth头不正确。无法确定应该在那里更改什么。

从这里看,您试图更改的资源或资源中的值不支持放置操作。您可以手动确认

或者去,


因此,关键是以这种方式更改变量:

$ResourceType=“存储过程”
$ItemName=“SP\U名称”
$ResourceLink=“dbs/$DBName/colls/$CollName/$ResourceType/$ItemName”
然后生成auth头。 也就是说,资源链接变量必须包含被替换对象的完整路径。

实际上,它应该:而且看起来确实如此。
...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime
...
$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime} 
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body