首页 > 解决方案 > 如何在 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 标头?

谢谢!

标签: powershelloffice365onedrivesharepoint-onlinecsom

解决方案


首先,您无法访问和自定义 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这个演示。


推荐阅读