Wielu klientów korzystających z SharePoint Online po raz pierwszy lub takich, którzy zmigrowali się z wersji on-premise trafia na wymagania biznesowe, które do zrealizowania potrzebują cyklicznego i automatycznego przetwarzania danych. Może to być przetwarzanie zawartości, nadawanie uprawnień, generowanie dokumentów, przesyłanie powiadomień itp. Niestety, w przypadku SharePoint Online taka funkcjonalność nie jest dostępna w porównaniu do SharePoint on-premise, gdzie można było uruchamiać zadania cykliczne (Joby). W części przypadków rozwiązaniem było przygotowanie np. usługi Windows, która po uruchomieniu na serwerze Windows (fizycznym lub wirtualnym) co określony czas przetwarzała dane. Jednak nie każdy z klientów posiada serwery które są nieustannie włączone. Z pomocą przychodzą nam Azure Functions. Funkcje Azure pozwalają na tworzenie nieskomplikowanych funkcji bezserwerowych w chmurze. Mogą być skalowane w miarę potrzeb, aby uzyskać duże możliwości obliczeniowe. Obsługiwane są różne języki programowania, w tym C# i Java. Istnieje możliwość sięgania po dane do pozostałych usług w ramach Azure oraz do systemów zewnętrznych poprzez Internet. Wykonanie kodu może być wyzwalane przez zapytania, np. GET, POST lub poprzez wyzwalanie czasowe. Zgodnie z cennikiem, jeśli cykliczne przetwarzanie danych nie będzie zbyt częste, usługę możemy wykorzystywać bezpłatnie. Klient posiada SharePoint Online w usłudze Office 365. Zbudował witrynę, w której gromadzi informacje o zamówieniach. Zamówienia wprowadzane są przez handlowców do listy SharePoint. Raz dziennie do pracownika obsługującego dostarczanie licencji ma spływać informacja o nowych zamówieniach. Klient nie posiada własnego środowiska serwerów, co uniemożliwia stworzenie usługi powiadomień w formie np. usługi Windows czy aplikacji konsolowej, uruchamianej przez harmonogram. Rozwiązaniem okazuje się wykorzystanie Azure Functions wykonywanych cyklicznie. Po wejściu w panel administracyjny Azure dodajemy Function App. Następnie dodajemy funkcję typu Timer np. w języku C#. Po chwili oczekiwania mamy już gotową funkcję. Po przejściu do zakładki „Integrate” możemy zdefiniować częstotliwość uruchamiania funkcji zgodnie ze standardem CRON. Powyższy przykład pokazuje wywołanie funkcji co 5 minut. Na witrynie SharePoint stworzono listę Zamówienia widoczną poniżej. Do listy trafiają informacje o sprzedaży produktu u klientów. Raz dziennie system ma powiadamiać pracownika o nowych zamówieniach. Przykład implementacji funkcji Azure: Powyższy kod jest tylko przykładem i powinien być zoptymalizowany np. poprzez zbudowanie zapytania CAML które wyfiltruje zamówienia stworzone danego dnia aby nie przetwarzać wcześniejszych zamówień. Do poprawnego uruchomienia funkcji wymagane jest dodanie pliku Project.json o zawartości pokazanej poniżej. Dzięki temu Azure dołączy do naszej funkcji wymagane biblioteki z NuGet. Jeśli wszystko napisaliśmy poprawnie po kliknięciu w przycisk Run zobaczymy poniższy efekt: W ramach testów funkcja została ustawiona aby startować co 5 minut. Poprawne działanie możemy zobaczyć w logu: Po poprawnym przetestowaniu funkcji należy ustawić jej docelowe wyzwalanie. Dla przykładu ustawienie wyzwalania codziennie o godzinie 23: Zbudowanie kodu funkcji jest identyczne jak zbudowanie aplikacji konsolowej które wykonywała by operacje na danych znajdujących się w witrynie SharePoint. W Visual Studio wystarczy stworzyć projekt aplikacji konsolowej, doinstalować z NuGet biblioteki np. „Microsoft.SharePointOnline.CSOM 16.1.7414.1200” i stworzyć standardowe rozwiązanie komunikujące się i przetwarzające dane SharePoint. Dodatkowo korzystając z bibliotek „Microsoft.Exchange.WebServices 2.2.0” również dostępnych w NuGet można połączyć się z Exchange i wysłać email do użytkownika informujący o efekcie przetwarzania danych. Należy jednak pamiętać aby referencje do bibliotek NuGet wskazać w pliku Project.json pokazanym w przykładzie. Wykorzystując Azure Functions w połączeniu z SharePoint Online można przygotować wiele dodatkowych mechanizmów przetwarzania danych które do tej pory z różnych powodów były niedostane dla klientów korzystających z usługi Office 365. Przy racjonalnym ustawieniu częstotliwości przetwarzania danych i optymalizacji czasu wykonywania kodu, funkcjonalności mogą być dla klienta bezpłatne. U naszych klientów spotkaliśmy się z różnymi potrzebami które zostały zrealizowane z użyciem Azure Functions wyzwalanych co określony czas:
SharePoint Online + Azure Free, Cześć 1: Cykliczne przetwarzanie danych
Niniejszy artykuł przedstawia możliwość wykorzystania bezpłatnych funkcjonalności Azure w połączeniu z SharePoint Online celem automatyzacji przetwarzania cyklicznego danych zamieszczonych w witrynie SharePoint.
Azure Functions
Problem biznesowy
Tworzenie funkcji
Przykład zastosowania
using Microsoft.SharePoint.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;
using System.Threading.Tasks;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
using (ClientContext clientContext = new ClientContext(„https://NAZWA_TENATA.sharepoint.com/sites/NAZWA_WITRYNY/"))
{
SecureString passWord = new SecureString();
foreach (char c in „HASŁO".ToCharArray())
passWord.AppendChar(c);
clientContext.Credentials = new SharePointOnlineCredentials(„UŻYTKOWNIK@DOMENA.PL", passWord);
Web web = clientContext.Web;
List zamowienia = web.Lists.GetByTitle(„Zamówienia");
ListItemCollection items = zamowienia.GetItems(CamlQuery.CreateAllItemsQuery());
clientContext.Load(web);
clientContext.Load(zamowienia);
clientContext.Load(items);
clientContext.ExecuteQuery();
var itemsFromToday = items.Where(ee => ((DateTime)ee[„Created"]).Date == DateTime.Now.Date).ToList();
StringBuilder sb = new StringBuilder();
sb.Append(„<h2>Nowe zamówienia</h2>");
foreach (ListItem item in itemsFromToday)
{
sb.Append(„<p>Klient: " + item[„Klient"].ToString() + „</p>");
sb.Append(„<p>Produkt: " + item[„Produkt"].ToString() + „</p>");
sb.Append(„<p>Ilość: " + item[„Licencje"].ToString() + „</p>");
sb.Append(„<p></p>");
}
SendMail(sb.ToString(), log);
}
}
private static void SendMail(string v, TraceWriter log)
{
log.Info($"Message: „+v);
// do wysłania wiadomości można użyć np. Exchange Web Services (EWS)
}
Komunikacja z SharePoint i Exchange
Podsumowanie
Zespół: Apps
Autor:
Kamil Warowny
Kamil Warowny
Ostatnie artykuły autora
Skontaktuj się z Kamilem