我有一个由Sharepoint(在线)Webhook触发的azure函数,该函数-每个引用实现-调用Sharepoint REST API以使用存储的ChangeToken来获取相关的更改。
Sharepoint资源已通过X509证书进行身份验证
订阅位于给定Sharepoint网站的默认文档库上。在测试设置中,只需一次操作即可将大量文件添加到文档库中
http请求遵循以下格式:
string requestUrl = String.Format("{0}/_api/lists('{1}')/getchanges", siteUrl, listId)
;
对API的查询遵循以下格式:
string query = "{'query': {'Activity':false,'Add':true,'Alert':false,'ChangeTokenStart':{ 'StringValue':'$ChangeTokenStart'},'ChangeTokenEnd':null,'ContentType':false,'DeleteObject':true,'Field':false,'File':true,'Folder':true,'Group':false,'GroupMembershipAdd':false,'GroupMembershipDelete':false,'Item':true,'LatestFirst':false,'List':true,'Move':true,'Navigation':false,'RecursiveAll':false,'Rename':true,'RequireSecurityTrim':false,'Restore':true,'RoleAssignmentAdd':false,'RoleAssignmentDelete':false,'RoleDefinitionAdd':false,'RoleDefinitionDelete':false,'RoleDefinitionUpdate':false,'SecurityPolicy':false,'Site':true,'SystemUpdate':false,'Update':true,'User':false,'View':false,'Web':false}}";
//$changeTokenStart gets replaced in the actual call
请求的构建如下:
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri(requestUrl));
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer",accessToken);
request.Content = new StringContent(query,Encoding.UTF8,"application/json");
观察:
尽管Sharepoint Webhooks上有官方文档,但Webhooks并不是每分钟左右触发一次,但它们 可以很频繁地触发。这意味着获取Webhook订阅 的更改可能导致对Sharepoint REST API的频繁调用。我的感觉是,Sharepoint后端正在根据列表中“活动”的数量来积极管理此频率。
对Sharepoint REST API的调用都使用相同的有效且正确获取的访问令牌,它们的调用大多返回HTTP状态码200(确定),但也经常返回HTTP状态码401(未授权)。那怎么可能?
在实施退避算法(只要REST API调用的状态代码不为200时运行),则返回“请求消息已发送。无法多次发送相同的请求消息。”当对Sharepoint API发出相同的http请求时。为什么?
有人排队如何解决这些问题?