powershell - 如何在 csom 上下文中获取重试标头?
问题描述
我正在使用 PowerShell 和 CSOM 来镜像 Sharepoint Online 和 OneDrive 站点及其所有文件。
因此,在几千个文件/几个小时的文件下载之后,正如预期的那样,抛出“操作已超时”异常。这是由于微软的节流。
为了防止超时,我使用了 CSOM 上下文的 RequestTimeOut 参数,还进行了增量重试,还将 ExecuteQuery() 调用的数量限制为每秒 2 次,并且还装饰了 CSOM 调用。然而,这还不够。
失败调用的 http 响应标头应该包含“Retry-After”行,我想用它来计时重试。
异常发生在 Microsoft.SharePoint.Client.ClientContext 的 ExecuteQuery() 或 [Microsoft.SharePoint.Client.File]::OpenBinaryDirect() 期间。
这是一些简化的代码摘录:
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($WebURL)
$Context.Credentials = $spoCredential
$Context.RequestTimeout = 60000; # 1 min
$Context.add_ExecutingWebRequest({
param($Source, $EventArgs)
$request = $EventArgs.WebRequestExecutor.WebRequest
$request.UserAgent = "XXX|CsomPs|MyScript/1.0"
})
$Web = $Context.Web
$Context.Load($Web)
$Context.ExecuteQuery()
在抛出“操作超时”异常之前,这一切都运行良好。比如说,示例的 $Context.ExecuteQuery() 引发了异常。
如何访问我的 CSOM powershell 脚本中的 http 响应,尤其是 http 响应标头,尤其是 Retry-After 标头?
谢谢!
解决方案
首先,您无法访问和自定义 HTTP 响应。这是由 SharePoint Online 端处理的。
其次,您应该避免在 SharePoint Online 中受到限制或阻止。微软没有确切的节流限制,所以你最好减少每个请求的操作数或减少调用频率这是CSOM中装饰流量的代码
// Get access to source site
using (var ctx = new ClientContext("https://contoso.sharepoint.com/sites/team"))
{
//Provide account and pwd for connecting to SharePoint Online
var passWord = new SecureString();
foreach (char c in pwd.ToCharArray()) passWord.AppendChar(c);
ctx.Credentials = new SharePointOnlineCredentials("contoso@contoso.onmicrosoft.com",
passWord);
// Add our User Agent information
ctx.ExecutingWebRequest += delegate (object sender, WebRequestEventArgs e)
{
e.WebRequestExecutor.WebRequest.UserAgent = "NONISV|Contoso|GovernanceCheck/1.0";
};
// Normal CSOM Call with custom User-Agent information
Web site = ctx.Web;
ctx.Load(site);
ctx.ExecuteQuery();
}
如果这没有帮助,您可以跟进CoreThrottling这个演示。
推荐阅读
- c++ - 如何在 C++ 中将类成员列为数据结构
- ofbiz - Ofbiz16.11 使用GUI的作业调度
- excel - excel的旋转按钮
- c# - NullReferenceException:对象引用未设置为对象的实例_
- python - 如何在python中打开csv?
- tensorflow - Keras - K.print 在损失函数中不起作用
- mysql - 更新 MariaDB 后如何停止 XAMPP 的 MySQL 服务
- node.js - How do i get nested schema keys from mongoose main model?
- scala - Heroku 的 Akka 应用程序出现错误:Web 进程无法绑定到 $PORT
- javascript - OT 未定义?