在 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 以查看原文