为何Invoke-RestMethod获取Azure Functions配置有时返回字符串而非对象?
我正在使用PowerShell拉取Azure Functions中托管应用的appsettings.json文件,遍历函数并获取配置以便后续操作,代码如下:
# Where the appsettings json lives on the function/service $pathToFile = "/site/wwwroot/appsettings.json" # get scm site cred $publishProfile = az webapp deployment list-publishing-credentials --name $functionApp.Name -g $functionApp.ResourceGroupName | ConvertFrom-Json $credential = [PSCredential]::new("$($publishProfile.publishingUserName)", (ConvertTo-SecureString -AsPlainText $publishProfile.publishingPassword -Force)) $api = "$($publishProfile.scmUri)/api/vfs" $jsonFileContent = Invoke-RestMethod -Credential $credential -Authentication Basic -Method Get -Uri "$api/$($pathToFile.Trim('/'))"
多数情况下,$jsonFileContent为可直接操作的PowerShell对象,但部分函数中该变量却为JSON格式的字符串,通过GetType()确认类型为String:
> $jsonfileContent.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
将其写入.json文件后验证JSON结构有效,可通过ConvertTo-Json和ConvertFrom-Json转换,但无法直接便捷操作。请问该现象的原因是什么?
响应Content-Type头不一致:
Invoke-RestMethod会根据响应的Content-Type头自动处理返回内容。如果Azure Functions返回的appsettings.json响应头为application/json,PowerShell会自动将JSON字符串解析为可操作的PSObject;但如果部分函数的响应头是text/plain或其他非JSON类型的MIME头,Invoke-RestMethod就会直接返回原始字符串,不做自动解析。文件编码或格式细节问题:少数情况下,
appsettings.json文件存在特殊编码(如带BOM的UTF-8),或者包含一些不影响JSON有效性但会干扰解析逻辑的特殊字符,导致Invoke-RestMethod的自动解析失效,最终返回原始字符串。Azure Functions运行时或SCM API差异:不同配置的Azure Functions实例(比如运行时版本不同、部署方式不同),其SCM站点的API在返回静态文件内容时可能存在处理逻辑差异。例如旧版本的Functions运行时,返回JSON文件时未正确设置
Content-Type头,导致PowerShell无法触发自动解析。
内容的提问来源于stack exchange,提问作者DL3001

