在 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_cht/archive/2011/10/07/saml-sharepoint-wcf-windows-token-sql-server.aspx。我設定了 CTWTS,讓我能 (因為我的應用程式是在我的使用者內容中執行) 模擬使用者身分。具體做法請參考:https://msdn.microsoft.com/zh-tw/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 當中就能得知)。此外,也必須執行在每部 SharePoint 伺服器上安裝的 CTWTS,而此程式碼需要在 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