SharePoint Online — извлечение сведений календаря

#c# #.net #rest #sharepoint

#c# #.net #остальное #sharepoint

Вопрос:

В контексте проекта мне нужно получить информацию из календаря SharePoint (время, события и т. Д.):

Первое изображение:

введите описание изображения здесь

Второе изображение:

введите описание изображения здесь

Прошло 2 дня, когда я пытался понять, как работают API SharePoint Online, и я не могу этого сделать.

Я понимаю, что существует 3 разных метода:

  • SCOM ;
  • SharePoint REST API v1
  • SharePoint REST API v2

Я протестировал несколько реализаций, но это никогда не работает:

#1 реализация:

 using Microsoft.SharePoint.Client;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        public static JToken GetList(Uri webUri, ICredentials credentials, string listTitle)
        {
            using (var client = new WebClient())
            {
                client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
                client.Credentials = credentials;
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");
                client.Headers.Add(HttpRequestHeader.Accept, "application/json;odata=verbose");
                var endpointUri = new Uri(webUri, string.Format("/_api/web/lists/getbytitle('{0}')", listTitle));
                var result = client.DownloadString(endpointUri);
                var t = JToken.Parse(result);
                return t["d"];
            }
        }
        static void Main(string[] args)
        {
            var webUri = new Uri("https://*********.sharepoint.com");
            const string userName = "**********";



            const string password = "*********";
            var securePassword = new SecureString();
            foreach (var c in password)
            {
                securePassword.AppendChar(c);
            }
            var credentials = new SharePointOnlineCredentials(userName, securePassword);

            var list = GetList(webUri, credentials, "Contacts");
            //print List title
            Console.WriteLine(list["Title"]);
        }
    }
}
  

#2 Реализация:

 using System;
using Microsoft.SharePoint.Client;
using System.Configuration;
using System.Security;
using System.Xml;
using TestSharePointRetrieveList.com.sharepoint.*******;
using System.Net;

namespace TestSharePointRetrieveList
{
    class Program
    {
        private static Web _web;
        private static ClientContext _context;

        public class VersionsHandler
        {
            private const string ListsServiceUrl = "/_vti_bin/Lists.asmx";
            private Lists lists = null;
            public string TenantUrl { get; set; }
            public String User { get; set; }
            public String Password { get; set; }
            public string Domain { get; set; }
            public string MySiteHost { get; set; }
            private Lists _lists
            {
                get
                {
                    if (lists == null)
                    {
                        if (!String.IsNullOrEmpty(TenantUrl))
                        {
                            this.lists = new Lists();
                            lists.Url = TenantUrl   ListsServiceUrl;
                            lists.UseDefaultCredentials = false;
                            lists.CookieContainer = new CookieContainer();
                            lists.CookieContainer.Add(GetFedAuthCookie(CreateSharePointOnlineCredentials()));
                            return lists;
                        }
                        else if (this.User.Length > 0 amp;amp; this.Password.Length > 0 amp;amp; this.Domain.Length > 0 amp;amp; this.MySiteHost.Length > 0)
                        {
                            this.lists = new Lists();
                            lists.Url = this.MySiteHost   ListsServiceUrl;
                            NetworkCredential credential = new NetworkCredential(this.User, this.Password, this.Domain);
                            CredentialCache credentialCache = new CredentialCache();
                            credentialCache.Add(new Uri(this.MySiteHost), "NTLM", credential);
                            lists.Credentials = credentialCache;
                            return lists;
                        }
                        else
                        {
                            throw new Exception("Please specify an authentication provider or specify domain credentials");
                        }
                    }
                    else
                    {
                        return this.lists;
                    }
                }
            }

            public XmlNode GetVersionCollection(string listId, string itemId, string fieldName)
            {
                return _lists.GetVersionCollection(listId, itemId, fieldName);
            }

            private SharePointOnlineCredentials CreateSharePointOnlineCredentials()
            {
                var spoPassword = new SecureString();
                foreach (char c in Password)
                {
                    spoPassword.AppendChar(c);
                }
                return new SharePointOnlineCredentials(User, spoPassword);
            }

            private Cookie GetFedAuthCookie(SharePointOnlineCredentials credentials)
            {
                string authCookie = credentials.GetAuthenticationCookie(new Uri(this.TenantUrl));
                if (authCookie.Length > 0)
                {
                    return new Cookie("SPOIDCRL", authCookie.TrimStart("SPOIDCRL=".ToCharArray()), String.Empty, new Uri(this.TenantUrl).Authority);
                }
                else
                {
                    return null;
                }
            }
        }

        static void Main(string[] args)
        {
            _context = new ClientContext(ConfigurationManager.AppSettings["TenantUrl"]);
            string userName = ConfigurationManager.AppSettings["AdminUser"];
            var passWord = new SecureString();
            foreach (char c in ConfigurationManager.AppSettings["Password"].ToCharArray())
            {
                passWord.AppendChar(c);
            }
            _context.Credentials = new SharePointOnlineCredentials(userName, passWord);
            _web = _context.Web;
            var list = _context.Web.Lists.GetByTitle("Retention Rules");
            var query = new CamlQuery();
            query.ViewXml =
              @"<View Scope='RecursiveAll'>  
                            <Query> 
                               <Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq></Where> 
                            </Query> 
                            <RowLimit>5000</RowLimit> 
                      </View>";
            var listItems = list.GetItems(query);
            _context.Load(_web);
            _context.Load(list);
            _context.Load(listItems);
            _context.ExecuteQuery();

            var versionsHandler = new VersionsHandler();
            versionsHandler.User = userName;
            versionsHandler.Password = ConfigurationManager.AppSettings["Password"];
            versionsHandler.TenantUrl = ConfigurationManager.AppSettings["TenantUrl"];

            if (listItems.Count == 0) throw new ArgumentException("No list items");

            var listId = list.Id.ToString();
            var itemId = listItems[0].Id.ToString();

            var versionNodes = versionsHandler.GetVersionCollection(listId, itemId, "Title");
            foreach (XmlNode node in versionNodes.ChildNodes)
            {
                if (node.Attributes != null)
                {
                    var title = node.Attributes["Title"].Value;
                    var modified = node.Attributes["Modified"].Value;

                    Console.WriteLine("Modified: {0}, Title: {1}", modified, title);
                }
            }
            Console.WriteLine("Hit any key to end.");
            Console.ReadKey();
        }
    }
}
  

Я всегда получал одну и ту же ошибку, но я не понимаю, почему:

Необработанное исключение типа ‘System.Net.WebException’ произошло в System.dll Дополнительная информация: Не удалось подключиться к удаленному серверу

{«Не удалось установить соединение, поскольку целевая машина активно отказалась от него 127.0.0.1: 8888»}

Я не понимаю, что я делаю плохо, кто-нибудь может помочь / посоветовать мне, пожалуйста? 🙂

Заранее благодарю вас.

Ответ №1:

Мой тестовый код для справки:

             var username = "[Loginname]";
            var password = "[Password]";
            var endPoint = "[Sharepoint Online Site Url]";
            var stsEndpoint = "https://login.microsoftonline.com/extSTS.srf";
            var signInUrl = "https://[ ShrepointOnlineDomain]/_forms/default.aspx?wa=wsignin1.0";
            var browserHost = "[Shrepoint Online Domain]"; //e.g. mycompany.sharepoint.com 
            var browserUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36";

            var cookies = new CookieContainer();
            var SMAL = "<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope' xmlns:a='http://www.w3.org/2005/08/addressing' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'><s:Header><a:Action s:mustUnderstand='1'>http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand='1'>https://login.microsoftonline.com/extSTS.srf</a:To><o:Security s:mustUnderstand='1' xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'><o:UsernameToken><o:Username>{USERNAME}</o:Username><o:Password>{PASSWORD}</o:Password></o:UsernameToken></o:Security></s:Header><s:Body><t:RequestSecurityToken xmlns:t='http://schemas.xmlsoap.org/ws/2005/02/trust'><wsp:AppliesTo xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'><a:EndpointReference><a:Address>{ENDPOINTREFERENCE}</a:Address></a:EndpointReference></wsp:AppliesTo><t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType><t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType><t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType></t:RequestSecurityToken></s:Body></s:Envelope>";
            var payLoadSts = SMAL.Replace("{USERNAME}", username).Replace("{PASSWORD}", password).Replace("{ENDPOINTREFERENCE}", endPoint);

            // webrequest 0 
            // webrequest 0: get the RpsContextCookie 
            // webrequest 0 
            string requiredAuthUrl = string.Format("{0}/_layouts/15/Authenticate.aspx?Source={1}", endPoint, HttpUtility.UrlDecode(endPoint));
            HttpWebRequest request0 = (HttpWebRequest)WebRequest.Create(requiredAuthUrl);
            request0.Accept = "*/*";
            request0.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US");
            request0.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
            request0.UserAgent = browserUserAgent;
            request0.AllowAutoRedirect = false;
            request0.CookieContainer = cookies;

            var response0 = (HttpWebResponse)request0.GetResponse();

            // webrequest 1
            // webrequest 1: login
            // webrequest 1
            var request1 = (HttpWebRequest)WebRequest.Create(stsEndpoint);
            request1.CookieContainer = cookies;
            var data = Encoding.ASCII.GetBytes(payLoadSts);

            request1.Method = "POST";
            request1.ContentType = "application/xml";
            request1.ContentLength = data.Length;

            using (var stream1 = request1.GetRequestStream())
            {
                stream1.Write(data, 0, data.Length);
            }

            // Response 1
            var response1 = (HttpWebResponse)request1.GetResponse();
            var responseString = new StreamReader(response1.GetResponseStream()).ReadToEnd();

            // Get BinarySecurityToken
            var xData = XDocument.Parse(responseString);
            var namespaceManager = new XmlNamespaceManager(new NameTable());
            namespaceManager.AddNamespace("S", "http://www.w3.org/2003/05/soap-envelope");
            namespaceManager.AddNamespace("wst", "http://schemas.xmlsoap.org/ws/2005/02/trust");
            namespaceManager.AddNamespace("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
            var BinarySecurityToken = xData.XPathSelectElement("/S:Envelope/S:Body/wst:RequestSecurityTokenResponse/wst:RequestedSecurityToken/wsse:BinarySecurityToken", namespaceManager);

            // webrequest 2
            // webrequest 2 //_forms/default.aspx?wa=wsignin1.0
            // webrequest 2
            var request2 = (HttpWebRequest)WebRequest.Create(signInUrl);

            var data2 = Encoding.ASCII.GetBytes(BinarySecurityToken.Value);
            request2.Method = "POST";
            request2.Accept = "*/*";
            request2.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US");
            request2.ContentType = "application/x-www-form-urlencoded";
            request2.UserAgent = browserUserAgent;
            request2.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
            request2.Host = browserHost;
            request2.ContentLength = data2.Length;
            request2.CookieContainer = cookies;

            using (var stream2 = request2.GetRequestStream())
            {
                stream2.Write(data2, 0, data2.Length);
            }

            // Response 2
            var response2 = (HttpWebResponse)request2.GetResponse();
            var responseString2 = new StreamReader(response2.GetResponseStream()).ReadToEnd();


            // webrequest 3
            // webrequest 3: get X-RequestDigest 
            // webrequest 3
            string restUrl3 = string.Format("{0}/_api/contextinfo", endPoint);
            var request3 = (HttpWebRequest)WebRequest.Create(restUrl3);
            request3.CookieContainer = cookies;
            request3.Method = "POST";
            request3.ContentLength = 0;

            // Response 3
            string formDigest = string.Empty;
            using (var response3 = (HttpWebResponse)request3.GetResponse())
            {
                using (var reader = new StreamReader(response3.GetResponseStream()))
                {
                    var result = reader.ReadToEnd();

                   // parse the ContextInfo response
                    var resultXml = XDocument.Parse(result);

                    // get the form digest value
                    var x = from y in resultXml.Descendants()
                            where y.Name == XName.Get("FormDigestValue", "http://schemas.microsoft.com/ado/2007/08/dataservices")
                            select y;
                    formDigest = x.First().Value;
                }
            }

            //Rest Call 1 
            string restUrl = string.Format("{0}/_api/web/GetFolderByServerRelativeUrl('Shared Documents')/files", endPoint);
            var req = (HttpWebRequest)WebRequest.Create(restUrl);
            req.CookieContainer = cookies;
            req.Method = "GET";
            req.Accept = "application/json; odata=verbose";
            req.ContentType = "application/json;odata=verbose";
            req.Headers.Add("X-RequestDigest", formDigest);
            var resp = (HttpWebResponse)req.GetResponse();
            var respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();
  

Источник: https://gallery.technet.microsoft.com/office/SharePoint-Online-access-d224a674

Способ 2. CSOM подключается к SharePoint Online

Комментарии:

1. Привет, Amos_MSFT, спасибо за ваш ответ. Я протестировал это решение / реализацию. Но у меня все та же проблема: i.stack.imgur.com/GxBZv.png Пожалуйста , у вас есть какая-нибудь идея? Похоже, это проблема с подключением, но я не понимаю, почему. Заранее благодарю вас. С наилучшими пожеланиями, Гэри

2. Убедитесь, что ваше соединение не находится в режиме прокси. Перейдите в «Свойства обозревателя» на вкладке «Подключение», нажмите «Настройки локальной сети» и снимите все галочки.