SharePoint CAML查询获取(401)未经授权的异常

时间:2016-08-22 07:09:32

标签: sharepoint caml

我的查询如下:

            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(); 

在这种情况下,propertiesSPItemEventProperties

每当它到达ExecuteQuery()时,它都会抛出异常:The remote server returned an error: (401) Unauthorized.

这可能是什么原因?

1 个答案:

答案 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))  
{
}

如果有帮助,请告诉我。