我的查询如下:
var site = properties.Site;
var context = new ClientContext(site.Url);
List list = context.Web.Lists.GetByTitle(properties.ListTitle);
var query = new CamlQuery();
query.ViewXml = "<View><Query><Where><Eq><FieldRef Name='FileLeafRef'/>" +
"<Value Type='Text'>" + fieldName + "</Value></Eq></Where></Query></View>";
ListItemCollection itemCollection = list.GetItems(query);
context.Load(itemCollection);
context.ExecuteQuery();
在这种情况下,properties
是SPItemEventProperties
。
每当它到达ExecuteQuery()
时,它都会抛出异常:The remote server returned an error: (401) Unauthorized.
这可能是什么原因?
答案 0 :(得分:1)
查看您的代码我猜这是与列表项操作相关的RER。碰巧的是,如果您从主机网络(而不是应用程序网站)运行它,或者您使用CSOM,则无法返回到SharePoint。最有可能的是,当您尝试调试代码时,您将看到您的RER未收到有效的上下文令牌(SPRemoteEventProperties.ContextToken
是一个空字符串)。另外,使用构造函数
var context = new ClientContext(site.Url);
不处理身份验证。你有令牌方法来做到这一点。
var context = TokenHelper.CreateRemoteEventReceiverClientContext(properties)
只要此事件在应用程序网站上,这将返回有效的上下文。
如果这无法解决您的问题,您需要在AppManifest中切换到使用应用权限并从SPHostUrl
var siteUrl = properties.Site.Url;
var siteUri = new Uri(siteUrl);
var realm = TokenHelper.GetRealmFromTargetUrl(siteUri);
var token = TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, realm).AccessToken;
using (var context = TokenHelper.GetClientContextWithAccessToken(siteUrl, token))
{
}
如果有帮助,请告诉我。