Partager via


在 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