SharePoint-서버 개체 모델

이 장에서는 SharePoint Server 개체 모델을 살펴 보겠습니다. SharePoint 컨텍스트 내에서 실행되는 코드를 작성할 때 SharePoint Server 개체 모델을 사용합니다. 몇 가지 일반적인 예는 페이지 또는 웹 파트의 코드 숨김, 기능 또는 목록 뒤의 이벤트 처리기, 타이머 작업 등입니다.

서버 개체 모델의 기능

다음은 서버 개체 모델의 주요 기능입니다.

  • SharePoint에서 사용하는 동일한 응용 프로그램 풀 내에서 ASP.NET 응용 프로그램을 프로그래밍하는 경우 서버 개체 모델을 사용할 수 있습니다.

  • 서버 개체 모델은 콘솔이나 Windows Forms 또는 SharePoint 서버에서 실행되는 WPF 앱과 같은 클라이언트 응용 프로그램을 개발하는 경우 사용할 수 있습니다.

  • 서버 개체 모델을 사용하여 SharePoint Server에 원격으로 연결할 수 없습니다.

  • Server Object Model을 사용하려면 다음을 참조하십시오. Microsoft.SharePoint어셈블리. 서버 개체 모델을 구성하는 다른 어셈블리가 있지만 Microsoft.SharePoint가 주요 어셈블리입니다.

  • 가장 일반적으로 사용할 핵심 유형은 최종 사용자로 사용하는 구성 요소에 매핑되므로 사이트 모음, 사이트, 목록, 라이브러리 및 목록 항목과 같은 항목은 SPSite, SPWeb, SPList, SPDocumentLibrary 및 SPListItem.

  • 사이트 모음을 나타내는 유형 및 서버 개체 모델은 SPSite이고 서버 개체 모델에서 SharePoint 사이트를 나타내는 유형은 SPWeb입니다. 따라서 최종 사용자 용어에서 개발자 용어로 이동할 때 정신적 매핑 만 수행하면됩니다.

이제 SharePoint를 처음 사용하기 시작하면 사이트에 과부하가 걸리고 웹 어휘는 말할 것도없고 최종 사용자 및 개발자 어휘에서 반대되는 것을 의미하기 때문에 혼란 스러울 수 있습니다.

서버 개체 모델의 간단한 예를 살펴 보겠습니다.

Step 1 − Visual Studio를 열고 다음에서 새 프로젝트를 만듭니다. File → New → Project 메뉴 옵션.

Step 2 − 다음에서 Windows 선택 Templates → Visual C#왼쪽 창에서 콘솔 애플리케이션을 선택합니다. 프로젝트 이름을 입력하고 확인을 클릭합니다.

Step 3 − 프로젝트가 생성되면 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Add → References.

Step 4 − 선택 Assemblies → Extensions 왼쪽 창에서 Microsoft.SharePoint를 확인하고 확인 버튼을 클릭합니다.

이제 솔루션 탐색기에서 프로젝트를 다시 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

Step 5 − 클릭 Build 왼쪽 창에서 탭하고 Prefer 32-bit 선택권.

Step 6 − 이제 Program.cs 파일을 열고 다음 코드로 바꿉니다.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SharePointData {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = web.Lists;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

Note− 위 코드에서 먼저 새 SPSite 개체를 생성했습니다. 이것은 일회용 개체이므로 using 문 내에서 생성됩니다. SPSite 생성자는 사이트 모음에 대한 URL을 가져 오며 사용자의 경우에는 다릅니다.

var web = site.RootWeb 사이트 모음의 루트를 가져옵니다.

web.Lists를 사용하여 목록을 가져오고 목록 항목의 제목을 인쇄 할 수 있습니다.

위의 코드가 컴파일되고 실행되면 다음과 같은 출력이 표시됩니다.

SharePoint Tutorials
   appdata
   Authors
   Composed Looks
   Contacts
   Course Documents
   Courses
   Documents
   List Template Gallery
   Master Page Gallery
   Site Assets
   Site Pages
   Solution Gallery
   Style Library
   Theme Gallery
   User Information List
   Web Part Gallery

이러한 제목이 솔루션 갤러리, 스타일 라이브러리, 양식 템플릿임을 알 수 있습니다. SharePoint에서 내부적으로 사용하는 목록입니다. 따라서 모든 목록을 표시하는 대신 사용자가 일반적으로 볼 수있는 목록 만 표시하고 싶을 수 있습니다.

따라서 전체 목록 컬렉션을 가져 오는 대신 숨겨지지 않은 모든 목록을 가져 오려고합니다. 아래와 같이 링크 쿼리를 사용하여이를 수행 할 수 있습니다.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

위의 코드가 컴파일되고 실행되면 다음과 같은 출력이 표시됩니다.

SharePoint Tutorials
   Authors
   Contacts
   Course Documents
   Courses
   Documents
   Site Assets
   Site Pages
   Style Library

이렇게하면 숨겨지지 않은 모든 목록이 반환된다는 것을 알 수 있습니다.

목록 항목에 대한 정보도 표시하는 또 다른 간단한 예를 살펴 보겠습니다.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
               var items = list.Items.OfType<SPListItem>().Take(5);
               var isDocLib = list is SPDocumentLibrary;
               
               foreach (SPListItem item in items) {
                  var value = isDocLib ? item.Name : item.Title;
                  Console.WriteLine("\t\t" + value);
               }
            }
            Console.ReadLine();
         }
      }
   }
}

위의 코드가 컴파일되고 실행되면 다음과 같은 출력이 표시됩니다.

SharePoint Tutorials
   Authors
      Muhammad Waqas
      Mark Upston
      Allan Bommer
      Andy Onian
   Contacts
      Waqas
      Upston
      Bommer
   Course Documents
      Sample1.docx
      Sample2.docx
      Sample3.docx
   Courses
      SharePoint Tutorials
      C# Tutorials
      ASP.Net Tutorials
      NHibernate Tutorials
   Documents
   Site Assets
   Site Pages
      Home.aspx
      How To Use This Library.aspx
   Style Library

데이터 나열

목록을 처음 만들면 항상 제목 열이 있습니다. 이 제목 열은 기본적으로 목록 항목 컨텍스트 또는 편집 제어 블록 메뉴에 대한 액세스를 제공합니다.

모든 목록은 제목 열로 시작하므로 SPListItem유형은 속성으로 노출합니다. 모든 단일 목록에 공통적이지 않은 열의 경우 인덱서를 통해 액세스 할 수 있습니다.SpListItem 유형.

몇 가지 정보를 인덱서에 전달할 수 있지만 가장 일반적인 정보는 Column. 목록 설정의 최종 사용자는이 이름을 변경할 수 있습니다. 이 이름은 다시 변경 될 수 있으므로 사용하고 싶지 않습니다.

두 번째는 InternalName이 목록이 생성되고 변경되지 않는 시점에 설정됩니다. 열 값에 액세스 할 때 사용하려는 이름입니다.

아래와 같이 Authors 목록을 검색하는 간단한 예를 살펴 보겠습니다.

이 예에서는 Authors 목록을 얻은 다음 Salary / Rate를 약간의 값으로 올립니다. 따라서 Salary / Rate 열에 대해InternalName.

Step 1− 서버 탐색기로 이동합니다. 마우스 오른쪽 버튼으로 클릭SharePoint Connections 연결 추가 ...를 선택합니다. URL을 지정하고 확인을 클릭합니다.

Step 2 − 확장 SharePoint Tutorials → List Libraries → Lists → Authors → Fields → Salary/Rate들. 마우스 오른쪽 버튼으로 클릭Salary/Rate속성을 선택합니다. 당신은 볼 것입니다InternalName 속성 창에서.

Step 3 − 다음은 급여 / 비율을 기준으로 저자를 검색하고 급여 / 비율을 올리는 간단한 예입니다.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = list.Items;
            ShowItems(items);
            RaiseRates(items);
            Console.WriteLine("\nAfter Raise\n");
            ShowItems(items);
            Console.ReadKey();
         }
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}", item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

위의 코드에서 두 가지 방법이 있음을 알 수 있습니다.

  • 하나는 호출되는 목록을 검색하는 것입니다. ShowItems

  • 다른 방법은 요금을 올리는 것입니다. RaiseRates().

위의 코드가 컴파일되고 실행되면 다음과 같은 출력이 표시됩니다.

Salary or rate for Muhammad Waqas is $950.00
Salary or rate for Mark Upston is $15.00
Salary or rate for Allan Bommer is $20.00
Salary or rate for Andy Onian is $870.00

After Raise

Salary or rate for Muhammad Waqas is $951.00
Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10
Salary or rate for Andy Onian is $871.00

CAML 쿼리

위의 예에서 우리는 항상 모든 항목을 반복하면서 foreach 루프를 사용하여 항목을 반복했으며 항상 모든 열을 다시 가져 왔거나 최소한 모든 열에 액세스 할 수있었습니다.

SQL 쿼리에서 테이블 이름에서 select *를 수행하는 것과 실제로 유사합니다.

이 문제를 해결하려면 CAML queries. CAML 쿼리를 수행 할 때 두 가지 옵션이 있습니다.

  • 단일 목록 만 쿼리하려는 경우 SPQuery 개체를 사용할 수 있습니다.

  • 사이트 모음의 여러 목록을 쿼리하려는 경우 SPSiteDataQuery를 사용할 수 있습니다.

일반적으로 SPSiteDataQuery, 특정 유형의 모든 목록을 쿼리합니다.

예를 들어, 모든 연락처 목록 등을 쿼리하려고합니다. SPSiteDataQuery를 사용하면 범위를 결정할 수 있으므로 전체 사이트 모음, 개별 사이트 또는 사이트와 모든 하위 항목을 쿼리하도록 지정할 수 있습니다.

CAML 쿼리의 구문은 기본적으로 XML 형식으로 설명되며 이러한 종류의 쿼리를 생성하는 데 익숙해지는 데 약간의 시간이 걸립니다.

CAML 쿼리의 간단한 예를 살펴 보겠습니다. 여기서는 작성자 목록의 데이터를 쿼리하는 CAML 쿼리를 생성합니다.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = QueryItems(list);
            ShowItems(items);
            
            //RaiseRates(items);
            //Console.WriteLine("\nAfter Raise\n");
            //ShowItems(items);
            Console.ReadKey();
         }
      }
      static SPListItemCollection QueryItems(SPList list) {
         var query = new SPQuery();
         
         query.ViewFields =
            "<FieldRef Name='Title' />" +
            "<FieldRef Name='Employee' />" +
            "<FieldRef Name='Salary_x002f_Rate' />";
         
         query.Query =
            "<OrderBy>" +
            " <FieldRef Name='Salary_x002f_Rate' />" +
            "</OrderBy>" +
            "<Where>" +
            " <Eq>" +
            " <FieldRef Name='Employee' />" +
            " <Value Type='Boolean'>False</Value>" +
            " </Eq>" +
            "</Where>";
         return list.GetItems(query);
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}",
            item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

CAML 쿼리를 사용하여 일부 항목을 가져 왔습니다. 에서QueryItems Employee가 아닌 항목 만 검색 한 것을 알 수 있습니다.

Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10