【问题标题】:SharePoint CAML query gets (401) Unauthorized exceptionSharePoint CAML 查询获取 (401) 未经授权的异常
【发布时间】:2016-08-22 15:33:10
【问题描述】:

我有一个如下所示的查询:

            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.

这可能是什么原因?

【问题讨论】:

    标签: sharepoint caml


    【解决方案1】:

    查看您的代码,我猜这是与列表项操作相关的 RER。碰巧的是,如果您从主机 Web(而不是应用程序 Web)运行它或使用 CSOM,它无法向 SharePoint 进行身份验证。当您尝试调试代码时,您很可能会看到您的 RER 没有收到有效的上下文令牌(SPRemoteEventProperties.ContextToken 是一个空字符串)。此外,您使用构造函数创建上下文的方式

    var context = new ClientContext(site.Url);
    

    不处理身份验证。你有令牌方法来做到这一点。

    var context = TokenHelper.CreateRemoteEventReceiverClientContext(properties)
    

    只要此事件在应用程序 Web 上,这将返回一个有效的上下文。 如果这不能解决您的问题,您将需要在您的 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))  
    {
    }
    

    如果有帮助,请告诉我。

    【讨论】:

    • 嗯,我似乎无法访问TokenHelper
    • 它应该在您的插件网页代码中,与项目根目录下的SharePointContext 类相同
    猜你喜欢
    • 2011-01-15
    • 2012-05-17
    • 2016-09-23
    • 2017-03-16
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多