{"id":4620,"date":"2017-10-10T11:23:45","date_gmt":"2017-10-10T09:23:45","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=4620"},"modified":"2023-08-30T09:21:00","modified_gmt":"2023-08-30T07:21:00","slug":"sharepoint-2013-od-architektury-do-klienckiej-aplikacji","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/sharepoint-2013-od-architektury-do-klienckiej-aplikacji\/","title":{"rendered":"SharePoint 2013 \u2013 od architektury do klienckiej aplikacji"},"content":{"rendered":"\n<p>Niniejszy artyku\u0142 ma na celu przybli\u017cenie architektury platformy SharePoint oraz sposobu pisania kodu po stronie klienta \u2013 czyli tzw. \u201eClient Side Object Model\u201d. W pierwszej cz\u0119\u015b\u0107 wpisu opisz\u0119 architektur\u0119 platformy SharePoint a nast\u0119pnie zaprezentuj\u0119 demo, obrazuj\u0105ce w jaki spos\u00f3b, za po\u015brednictwem klienckiej aplikacji, mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z SharePointem i w jaki spos\u00f3b przebiega przep\u0142yw informacji podczas takiej komunikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czym jest SharePoint<\/h2>\n\n\n\n<p>SharePoint jest \u201edzieckiem\u201d Microsoft\u2019u, s\u0142u\u017c\u0105cym do zarz\u0105dzania informacjami\/dokumentami \u2013 najcz\u0119\u015bciej w sieci korporacyjnej. Pozwala na zarz\u0105dzanie informacjami i zabezpieczenie ich, czyli stricte: plik\u00f3w, dokument\u00f3w, kt\u00f3re s\u0105 przesy\u0142ane pomi\u0119dzy serwerem a klientem. Dzi\u0119ki funkcji kolaboracji dokument\u00f3w, u\u017cytkownicy mog\u0105 pracowa\u0107 np. na jednym egzemplarzu dokumentu w danej chwili. Dodatkowo Microsoft SharePoint mo\u017ce pe\u0142ni\u0107 rol\u0119 platformy deweloperskiej. Zdecydowanie najpowszechniej wykorzystuje si\u0119 technologi\u0119 SharePoint do tworzenia portali intranetowych. Taki portal to skuteczny spos\u00f3b na scentralizowanie dost\u0119pu do informacji w obszarze sieci korporacyjnej. Ponadto SharePoint jest cz\u0119sto u\u017cywany do przechowywania i wyszukiwania dokument\u00f3w elektronicznych. Pozwala r\u00f3wnie\u017c na \u015bledzenie kolejnych wersji dokument\u00f3w modyfikowanych przez r\u00f3\u017cnych u\u017cytkownik\u00f3w. Mo\u017ce tak\u017ce s\u0142u\u017cy\u0107 jako centralne repozytorium dokument\u00f3w. Pozwala to znacz\u0105co ograniczy\u0107 duplikowanie danych przesy\u0142anych pomi\u0119dzy klientem a serwerem. Wida\u0107 tutaj potencja\u0142 i mo\u017cliwo\u015bci platformy SharePoint. Przyjrzyjmy si\u0119 og\u00f3lnej architekturze ca\u0142ej platformy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architektura<\/h2>\n\n\n\n<p>Podstawow\u0105 jednostk\u0105 platformy SharePoint jest farma. Ale co to takiego jest farma? Najpro\u015bciej ujmuj\u0105c farma jest zbiorem r\u00f3l SharePoint i Microsoft SQL Server, kt\u00f3re s\u0105 powi\u0105zane przez wsp\u00f3ln\u0105 baz\u0119 danych konfiguracji. Aby SharePoint\u2019owa farma mog\u0142a istnie\u0107 musi zawiera\u0107 co najmniej jedn\u0105 aplikacj\u0119 sieci Web. Aplikacja ta jest znana jako Centralna Administracja \u2013 w skr\u00f3cie po prostu CA. Ta aplikacja wraz z innymi aplikacjami sieci Web jest przechowywana na serwerze IIS. Zag\u0142\u0119bimy si\u0119 teraz mocniej w struktur\u0119. Ka\u017cda dzia\u0142aj\u0105ca Web Aplikacja musi zawiera\u0107 co najmniej jeden zbi\u00f3r witryn. Kolejne poj\u0119cie, kt\u00f3re ma\u0142o m\u00f3wi ? Ju\u017c spiesz\u0119 z wyja\u015bnieniem. Zbi\u00f3r witryn jest logicznym kontenerem, kt\u00f3ry sk\u0142ada si\u0119 z jednej lub wi\u0119kszej liczby witryn \u2013 generalnie s\u0142u\u017cy do udost\u0119pniania tre\u015bci u\u017cytkownikom. Naturalnym krokiem wewn\u0105trz struktury SharePoint\u2019a jest witryna. Znajduje si\u0119 ona w zbiorze witryn. Warto nadmieni\u0107, \u017ce Aplikacja Webowa mo\u017ce zawiera\u0107 wiele zbior\u00f3w witryn, a ka\u017cdy taki pojedynczy zbi\u00f3r mo\u017ce zawiera\u0107 bardzo wiele witryn. Ka\u017cda witryna z kolei mo\u017ce zawiera\u0107: Biblioteki, Listy, Strony. Struktur\u0119 t\u0119 obrazuje poni\u017cszy schemat:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/Drzewko-SharePointa.png\"><img decoding=\"async\" width=\"575\" height=\"403\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/Drzewko-SharePointa.png\" alt=\"struktura witryny SharePoint\" class=\"wp-image-4621\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/Drzewko-SharePointa.png 575w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/Drzewko-SharePointa-300x210.png 300w\" sizes=\"(max-width: 575px) 100vw, 575px\" \/><\/a><\/figure>\n\n\n\n<p>Podsumowuj\u0105c temat architektury, \u0142atwo wyczu\u0107 jak rozleg\u0142a jest platforma SharePoint i jak wielkie mo\u017cliwo\u015bci oferuje. Skoro podstawowa struktura zosta\u0142a przedstawiona, mo\u017cemy zaj\u0105\u0107 si\u0119 zbudowaniem lub skonfigurowaniem (?) aplikacji klienckiej umo\u017cliwiaj\u0105cej komunikacj\u0119 z SharePointem oraz dok\u0142adnie om\u00f3wi\u0107 kod aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CSOM<\/h2>\n\n\n\n<p>Client Side Object Model to API u\u017cywane do budowy klienckich aplikacji na platform\u0119 SharePoint. Zosta\u0142o ono zaprojektowane w taki spos\u00f3b, aby przypomina\u0142o podej\u015bcie Server Object Model. W ramach ciekawostki dodam, \u017ce zosta\u0142o ono wprowadzone do platformy SharePoint w wersji 2010, a rozbudowane w wersji 2013. CSOM posiada trzy implementacje: .NET\u2019ow\u0105, Silverlight\u2019ow\u0105 oraz JavaScript\u2019ow\u0105. Warto tutaj r\u00f3wnie\u017c wspomnie\u0107 o Client.svc. Jest to serwis oparty o WCF, s\u0142u\u017c\u0105cy do komunikacji z SharePoint Serwerem. Generalnie na tym serwisie \u201ena\u0142o\u017cony\u201d jest wzorzec projektowy \u201eFasada\u201d, kt\u00f3ry ujednolica dost\u0119p do z\u0142o\u017conego systemu platformy SharePoint poprzez&nbsp; uporz\u0105dkowany interfejs programistyczny. Tworz\u0105c demo skupimy si\u0119 na .NET\u2019owej implementacji aplikacji. Poni\u017cej przedstawiam schemat przep\u0142ywu danych: od klienta do SharePoint serwera:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/CSOM-Schema.png\"><img decoding=\"async\" width=\"817\" height=\"352\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/CSOM-Schema.png\" alt=\"przep\u0142yw od klienta do SharePoint Servera \" class=\"wp-image-4624\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/CSOM-Schema.png 817w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/CSOM-Schema-300x129.png 300w\" sizes=\"(max-width: 817px) 100vw, 817px\" \/><\/a><\/figure>\n\n\n\n<p>Przy okazji omawiania demo, kt\u00f3re b\u0119dzie przedstawione poni\u017cej, b\u0119d\u0119 odwo\u0142ywa\u0142 si\u0119 do powy\u017cszego schematu.<br>Obiecane demo jest bardzo prost\u0105 aplikacj\u0105 konsolow\u0105 komunikuj\u0105c\u0105 si\u0119 z SharePointem i pobieraj\u0105c\u0105 dane z istniej\u0105cej ju\u017c listy oraz wy\u015bwietlaj\u0105c\u0105 je. Generalnie, aby sprawdzi\u0107 dzia\u0142anie tej prostej aplikacji lokalnie na swoim \u015brodowisku, powinni\u015bmy stworzy\u0107 now\u0105 site collection (mo\u017cna te\u017c u\u017cy\u0107 ju\u017c istniej\u0105cej), a na niej now\u0105 list\u0119, kt\u00f3r\u0105 trzeba wype\u0142ni\u0107 przyk\u0142adowymi danymi. Przejd\u017amy do om\u00f3wienia samego kodu demo. Pierwsz\u0105 rzecz\u0105 po wygenerowaniu nowego projektu, czyli konsolowej aplikacji w VS, jest dodanie dw\u00f3ch corowych assembly do zbioru referencji projektu. Te dwa kluczowe elementy dla .NET\u2019owej implementacji CSOM\u2019a to: Microsoft.SharePoint.Client.dll oraz Microsoft.SharePoint.Client.Runtime.dll. Gdy wykonamy t\u0119 czynno\u015b\u0107 mo\u017cemy zabra\u0107 si\u0119 za pisanie kodu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System;\nusing System.Configuration;\nusing Microsoft.SharePoint;\nusing Microsoft.SharePoint.Client;\n \nnamespace DemoForArtConsole\n{\ninternal class Program\n{\n\/\/ Zdefiniowanie adresu site kolekcji na kt\u00f3rej znajduje si\u0119 lista.\npublic const string SiteUrl = &quot;http:\/\/cldcwspdev18\/sites\/demo&quot;;\n \npublic static void Main(string&#x5B;] args)\n{\n\/\/ Zamkni\u0119cie komuniakcji naszej aplikacji z SP w blok using\n\/\/ gwaratnuje zwolnienie niezarz\u0105dzanych zasob\u00f3w i zamkni\u0119cie\n\/\/ po\u0142\u0105czenia z platform\u0105 SP. Dodatkowo w bloku tym tworzony\n\/\/ jest kontekst dla naszej aplikacji na podstawie url&#039;a site collection.\nusing (var clientContext = new ClientContext(SiteUrl))\n{\n\/\/ U\u017cywaj\u0105c kontekstu dobieramy si\u0119 do odpowiedniego web&#039;a.\nvar web = clientContext.Web;\n \n\/\/ Pobieramy list\u0119 z web&#039;a na podstawie jej tytu\u0142u.\nvar list = web.Lists.GetByTitle(&quot;DemoList&quot;);\n \n\/\/ Tworzymy zapytanie o elemnty list a nast\u0119pnie\n\/\/ bazuj\u0105c na tym CAML&#039;owym zapytaniu pobieramy\n\/\/ wszystkie itemy z naszej listy.\nvar query = new CamlQuery {ViewXml = &quot;&lt;view&gt;&quot;};\nvar items = list.GetItems(query);&lt;\/view&gt;\n \n\/\/Przekazujemy referencje odpowiednich obiekt\u00f3w do metody load.\nclientContext.Load(list);\nclientContext.Load(items);\n \n\/\/ &quot;Odpalamy&quot; po\u0142\u0105czenie z client SVC aby otrzyma\u0107 warto\u015bci\n\/\/ dla obiekt\u00f3w kt\u00f3re zdefiniowali\u015bmy w metodzie Load.\nclientContext.ExecuteQuery();\n \n\/\/ Wy\u015bwietlamy itemy z listy na konsoli.\nforeach (var item in items)\n{\nConsole.WriteLine(&quot;Item &quot; + item.Id + &quot; | &quot;\n+ &quot;Title: &quot; + item&#x5B;&quot;Title&quot;]);\n}\n \nConsole.ReadLine();\n}\n}\n}\n}\n<\/pre><\/div>\n\n\n<p>Poni\u017cej przedstawiam wynik dzia\u0142ania powy\u017cszej aplikacji:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/RESULTS.png\"><img decoding=\"async\" width=\"662\" height=\"229\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/RESULTS.png\" alt=\"aplikacja SharePoint\" class=\"wp-image-4629\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/RESULTS.png 662w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/09\/RESULTS-300x104.png 300w\" sizes=\"(max-width: 662px) 100vw, 662px\" \/><\/a><\/figure>\n\n\n\n<p>Jak wida\u0107 nasza aplikacja skomunikowa\u0142a si\u0119 z SharePointem i pobra\u0142a dane, o kt\u00f3re zabiegali\u015bmy. Warto tutaj wspomnie\u0107 o kilku kluczowych elementach. Wy\u017cej nie wspomnia\u0142em o tym, dlaczego w klasie ClientContext mo\u017cemy u\u017cy\u0107 konstrukcji using. Ot\u00f3\u017c klasa ta implementuje interfejs IDisposable, kt\u00f3ry jest odpowiedzialny np. za zwalnianie zasob\u00f3w niezarz\u0105dzanych, roz\u0142\u0105czanie po\u0142\u0105czenia TCP\/IP. Warto r\u00f3wnie\u017c wspomnie\u0107 o metodach Load oraz ExecuteQuery. Obydwie metody s\u0105 triggerami \u017c\u0105da\u0144 POST do serwisu Client.svc, znajduj\u0105cego si\u0119 na SharePoint serwerze. Generalnie wi\u0119kszo\u015b\u0107 obiekt\u00f3w, kt\u00f3re tworzymy w CSOM to tzw. \u201epuste pow\u0142oki\u201d (ang. \u201eempty shells\u201d). Oznacza to, \u017ce gdy b\u0119dziemy chcieli si\u0119 odwo\u0142a\u0107 do warto\u015bci ich propercji przed u\u017cyciem metody Load i ExecuteQuery zostanie wyrzucony wyj\u0105tek \u2013 warto\u015bci tych propercji nie s\u0105 zainicjowane. U\u017cywaj\u0105c wy\u017cej wymienionych metod wype\u0142niamy warto\u015bci propercji. W metodzie Load umieszczamy warto\u015b\u0107 w\u0142a\u015bciwo\u015bci, kt\u00f3r\u0105 chcemy otrzyma\u0107 w nast\u0119pnym cyklu. Warto tutaj nadmieni\u0107, \u017ce typy prymitywne mog\u0105 by\u0107 zwracane automatycznie, natomiast typami z\u0142o\u017conymi, czyli np. kolekcjami, musimy zaj\u0105\u0107 si\u0119 explicite. Metoda ExecuteQuery odpala po\u0142\u0105czenie z serwisem Client.svc przy u\u017cyciu kt\u00f3rego dane s\u0105 wyci\u0105gane z bazy danych zawarto\u015bci, a warto\u015bci naszych w\u0142a\u015bciwo\u015bci s\u0105 wype\u0142niane odpowiednimi danymi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Podsumowuj\u0105c SharePoint jest bardzo rozbudowan\u0105 platform\u0105 o ogromnych mo\u017cliwo\u015bciach. Tworz\u0105c demo wybra\u0142em implementacj\u0119 CSOM\u2019a opart\u0105 o .NET, jednak dok\u0142adnie ten sam efekt mo\u017cna uzyska\u0107 tworz\u0105c klienck\u0105 aplikacj\u0119 w JavaScript. Jednak to jest ju\u017c temat na zupe\u0142nie nowy wpis. Dodatkowo warto wspomnie\u0107 o mo\u017cliwo\u015bci \u0142\u0105czenia SharePoint\u2019a z Angularem. Daje to pot\u0119\u017cne mo\u017cliwo\u015bci pe\u0142nego personalizowania witryn. Tematy te postaram si\u0119 poruszy\u0107 w nast\u0119pnych wpisach.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;4620&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;SharePoint 2013 \u2013 od architektury do klienckiej aplikacji&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Niniejszy artyku\u0142 ma na celu przybli\u017cenie architektury platformy SharePoint oraz sposobu pisania kodu po stronie klienta \u2013 czyli tzw. \u201eClient &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/sharepoint-2013-od-architektury-do-klienckiej-aplikacji\/\">Continued<\/a><\/p>\n","protected":false},"author":135,"featured_media":15257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":4,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[56],"class_list":["post-4620","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-sharepoint"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/10\/BlogersiiCovery-Sharepoint.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4620"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/135"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=4620"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4620\/revisions"}],"predecessor-version":[{"id":23888,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/4620\/revisions\/23888"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/15257"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=4620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=4620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=4620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}