다음을 통해 공유


在 SharePoint 2010 中使用社会性标签

原文发布于 2011 年 9 月 29 日(星期四)

注意:请下载附件以获取包含该文章的人工可读格式的 Word 文档。

最近,我收到某人提出的一个有趣的请求,本质上是希望能够在两个不同的服务器场之间迁移社会性标签。有一些现成的功能可以帮助您完成此操作,这些功能很诱人但远远不够。

我尝试过获取社会性标签本身而不进行任何类型的“真正模拟”。这对我而言是可行的,但我不能保证在所有情况下都可行,因为我是以 UPA 管理员身份登录的。如果不可行,则您可以使用我将在下面描述的同一模拟方法。为了获取用户标签,我只是尝试以该用户身份创建了一个 SPSite 上下文,然后创建检索该用户的标签所需的所有上下文对象,如下所示:

SPUserToken sut = null;

//get the user token for user first so we can

//use that to get a site context as that user

using (SPSite userSite = new SPSite(UrlTxt.Text))

{

   using (SPWeb rootWeb = userSite.RootWeb)

   {

       SPUser socialUser =

          rootWeb.EnsureUser(AccountTxt.Text);

       sut = socialUser.UserToken;

   }

}

                

//now get the site as that user – NOTE: these are

//all class scoped variables

using (SPSite newSite = new SPSite(UrlTxt.Text, sut))

{

   sc = SPServiceContext.GetContext(newSite);

   stm = new SocialTagManager(sc);

   upm = new UserProfileManager(sc);

   up = upm.GetUserProfile(AccountTxt.Text);

}

 

拥有以当前用户身份创建的上下文后,获得该用户的标签就相当简单了:

SocialTag[] tags = stm.GetTags(up);

 

TagLst.Items.Clear();

foreach (SocialTag tag in tags)

{

   TagLst.Items.Add(tag.Term.Name + " - " + tag.Url.ToString());

}

 

这一部分相当简单直接。遗憾的是,为不同的用户编写社会性标签却不那么容易。SocialTagManager 包含一个 AddTag 方法,但它不像 GetTags 方法那样提供包含 UserProfile 的重载。这是一个非常糟糕的疏忽,并且遗憾的是,使用传入新 SPSite 构造函数的用户上下文并不能解决问题。因此,您需要使用模拟来实现此目的。在本例中,我只是重用了在以下文章中介绍的方法 – https://blogs.msdn.com/b/sharepoint_chs/archive/2011/10/07/saml-sharepoint-wcf-windows-sql-server.aspx。我配置了 CTWTS 以允许我(因为我的应用程序在我的用户上下文中运行)模拟用户。下面是操作的具体细节: https://msdn.microsoft.com/zh-cn/library/ee517258.aspx

围绕该方法,下面是我首次进行模拟时的具体操作:

//start the impersonation

//create the WindowsIdentity for impersonation

WindowsIdentity wid = null;

 

try

{

   wid = S4UClient.UpnLogon(EmailTxt.Text);

}

catch (SecurityAccessDeniedException adEx)

{

   MessageBox.Show("Could not map the Email to " +

       "a valid windows identity: " + adEx.Message);

}

 

//see if we were able to successfully login

if (wid != null)

{

   using (WindowsImpersonationContext ctx = wid.Impersonate())

   {

       //code goes here to add a new tag

   }

}

else

{

   MessageBox.Show("Couldn't impersonate user - can't add tag.");

}

 

模拟代码本身并不是特别复杂 – 您只需要知道用户的电子邮件地址(或许可以从此代码检索的 UserProfile 中获得)。您还需要运行 CTWTS,它安装在每台 SharePoint 服务器上,并且由于该代码使用对象模型,因此它需要在 SharePoint 服务器上运行。同样,这应该不是很大的障碍。

最后,为用户添加新标签确实需要执行一些操作,但这些操作很容易管理。下面是代码内容:

//this is the code that gets the SPSite, SPServiceContext, etc

GetServiceContext();

 

//work with the taxonomy classes so we

//can reuse any existing term, or create a

//new one if it doesn't exist

TaxonomySession txs = stm.TaxonomySession;

TermStore ts = txs.DefaultKeywordsTermStore;

 

TermCollection terms =

   ts.KeywordsTermSet.GetTerms(TagTxt.Text,

   ts.DefaultLanguage, true);

 

Term t = null;

 

if (terms.Count == 0)

{

   t = ts.KeywordsTermSet.CreateTerm(TagTxt.Text,

       ts.DefaultLanguage);

       ts.CommitAll();

}

else

   t = terms[0];

 

//add the tag

stm.AddTag(new Uri(TagUrlTxt.Text), t);

 

因此,此时我们需要在分类库中查找所添加的标签。如果在那里找到该术语,则使用它,否则我们将创建该术语并将其添加到术语库中。然后我们将添加该术语并将其与 URL 关联,从而将其添加到该用户的社会性标签中。

整体而言,代码和方法都相当简单。主要问题是无法指定应向哪个用户添加社会性标签。模拟代码和 CTWTS 会替我们解决该问题,而不需要每个用户的密码。文章中附带有该项目的源代码。

 

这是一篇本地化的博客文章。请访问 Working with Social Tags in SharePoint 2010 以查看原文