1

我正在尝试使用在 SharePoint 2013 服务器中部署的自定义 WCF Web 服务在 SharePoint 2013 中创建一个新术语集。我写了下面的代码来创建术语集。

SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (Impersonator imp = new Impersonator("Username", "Domain", "Password"))
                {
                    using (SPSite site = new SPSite("http://server:8002/sites/site/"))
                    {
                        site.AllowUnsafeUpdates = true;
                        TaxonomySession session = new TaxonomySession(site);
                        TermStore termStore = session.TermStores["Managed Metadata Service"];
                        var termStoreAdmin = termStore.TermStoreAdministrators.Where(obj => obj.PrincipalName.Contains("domain\\username")).FirstOrDefault();

                        if (termStoreAdmin == null)
                            termStore.AddTermStoreAdministrator("domain\\username");

                        Group group = termStore.GetGroup(new Guid(groupGuid));
                        if (group != null && !string.IsNullOrEmpty(termSetName))
                        {
                            TermSet termset = group.TermSets.FirstOrDefault(obj => obj.Name.Equals(termSetName));
                            if (termset == null)
                            {
                                termset = group.CreateTermSet(termSetName);
                                termSetGuid = termset.Id.ToString();
                            }
                            SetupNavTermSet(termset, session, site.OpenWeb());
                        }
                        termStore.CommitAll();
                    }
                }
            });

我使用肥皂消息从 silverlight 代码调用此方法。在调用此代码时,我在执行group.CreateTermSet(termSetName);行时遇到异常。

错误是:

Error Message :  Value cannot be null.
Source        : Microsoft.SharePoint
Error Details :     at Microsoft.SharePoint.Administration.Claims.SPClaimProviderManager.GetUserIdentifierEncodedClaim(IIdentity identity)
   at Microsoft.SharePoint.Taxonomy.Internal.CommonUtilities.GetCurrentUserName()
   at Microsoft.SharePoint.Taxonomy.TaxonomySession.get_CurrentUserName()
   at Microsoft.SharePoint.Taxonomy.Group.CreateTermSet(String name, Guid newTermSetId, Int32 lcid)
   at Microsoft.SharePoint.Taxonomy.Group.CreateTermSet(String name)
   at SplitVisionMetadataManagement.CustomManageMetaDataWCFService.<>c__DisplayClassc.<CreateTaxonomyTermSet>b__8()

有没有人遇到这个问题和解决方案?

4

1 回答 1

2

我也遇到了同样的问题,并发现 Microsoft.SharePoint.Taxonomy.Internal.CommonUtilities.GetCurrentUserName() 方法使用 HttpContext.Current.User 安全主体来获取用户名。

我在 Windows 窗体应用程序中使用类似的代码,因此 HttpContext 是空的。我通过手动设置上下文和用户来解决问题,如下所示。

if (HttpContext.Current == null)  
{  
    HttpRequest request = new HttpRequest("", SiteURL, "");  
    HttpContext.Current = new HttpContext(request, new HttpResponse(TextWriter.Null));  
    HttpContext.Current.User = System.Threading.Thread.CurrentPrincipal;  
}  

SPSecurity.RunWithElevatedPrivileges(delegate()  
{  
    using (SPSite site = new SPSite(SiteURL))  
    {  
        using (SPWeb web = site.OpenWeb())  
        {  
            if (HttpContext.Current.Items["HttpHandlerSPWeb"] == null)  
                HttpContext.Current.Items["HttpHandlerSPWeb"] = web;  

            // Your SharePoint Term Creation code
        }
    }
});

在您的情况下,您似乎正在使用基于声明的身份验证,因此声明提供者在返回名称时存在一些问题。您的 HTTP 上下文将是 WCF 运行的上下文。您可能需要从这些角度进一步调查。

上面的知识应该可以帮助你进一步理解它。

于 2014-01-28T19:35:21.660 回答