2013-09-05 2 views
1

Я пытаюсь создать новый термин, установленный в SharePoint 2013, используя пользовательский веб-сервис WCF, развернутый на сервере SharePoint 2013. Я написал ниже код для создания термина set.Создание TermSet дает ошибку в SharePoint 2013 с использованием настраиваемого webservice

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

Кто-нибудь получил этот вопрос и решение?

ответ

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. Возможно, вам придется исследовать дальше в этом углу.

Вышеуказанные знания должны помочь вам понять это дальше.