SharePoint 2010에서 공유 태그 사용
최초 문서 게시일: 2011년 9월 29일 목요일
참고: 이 게시물을 쉽게 읽을 수 있는 Word doc 형식으로 확인하려면 첨부 파일을 다운로드하십시오.
최근 서로 다른 두 팜 간에 공유 태그를 마이그레이션하는 방법을 알려 달라는 흥미로운 요청을 받은 적이 있습니다. 이 작업을 위해 사용 가능한 몇 가지 기본 제공 기능이 있으며, 충분하지는 않지만 어느 정도는 도움이 되는 방법도 있습니다.
이 작업을 위해 어떤 종류의 "실제" 가장도 적용하지 않고 공유 태그 자체만 사용하여 테스트를 해 보았습니다. 제 경우에는 이 방식이 작동을 했지만, 저는 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_ko/archive/2011/10/07/saml-sharepoint-wcf-windows-sql-server.aspx 게시물에서 설명한 방식을 다시 사용했습니다. 즉, 제 응용 프로그램은 제 사용자 컨텍스트에서 실행 중이었으므로 CTWTS를 구성하여 사용자를 가장했습니다. 이 작업을 수행하는 자세한 방법은 https://msdn.microsoft.com/ko-kr/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을 참조하십시오.