我在PowerShell核心堆栈上有HTTP触发的Azure功能应用程序。脚本正在分析请求的正文,假设一切正常,它连接到Exchange Online,然后执行2个cmdlet来创建MailContact类型的联系人。最后,它断开了与Exchange Online的连接。我有一个控制台应用程序,它正在执行POST请求,为身体中的一个联系人传递JSON数据。请求在for each循环中执行,在第5次成功请求后,我得到的运行空间超出预算错误。
脚本中的一些代码片段
try {
Connect-ExchangeOnline -CertificateThumbprint $thumb -AppId $appId -Organization $org -Showbanner:$false -CommandName Get-Contact,Get-MailContact,New-MailContact,Set-Contact,Set-MailContact,Remove-MailContact
New-MailContact -ErrorAction stop @p | Out-Null
Set-Contact -ErrorAction stop @parameters | Out-Null
}
catch {
...
}
finally {
Disconnect-ExchangeOnline -Confirm:$false -InformationAction Ignore -ErrorAction SilentlyContinue
Get-PSSession | Remove-PSSession
}
我尝试了什么(没有成功(:
- 放宽Exchange Online限制策略(https://www.michev.info/Blog/Post/3205/self-service-powershell-throttling-policy-relaxation-for-exchange-online)
- 设置不同的环境变量(如PSWorkerInProcCurrentUpperBound和FUNCTIONS_WORKER_PROCESS_COUNT(
工作原理:拥有额外的Function App,然后在两者之间每5个请求循环一次。
可能有帮助的其他信息:
- PSWorkerInProcCurrentUpperBound=1000
- FUNCTIONS_WORKER_PROCESS_COUNT=10
- 函数运行时版本=~4
- PowerShell核心版本=7
- 平台=64位
- 计划类型=消耗(无服务器(
此外,从发送请求到得到响应大约需要7-8秒。连接到Exchange Online需要花费大量时间。
有任何帮助或提示如何解决运行空间预算错误吗?
一个肮脏的解决方法是:
try {
Connect-ExchangeOnline @ConnectExchange
} catch {
Write-Verbose -Verbose ($_.Exception.Message)
$Wait = ($_.Exception.Message) | Select-String ('(?<=for )(.*)(?= seconds)') -AllMatches
$Count = ([int]$Wait.Matches.Value)
Start-Sleep -seconds $Count
Connect-ExchangeOnline @ConnectExchange
}