#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. Убедитесь, что ваше соединение не находится в режиме прокси. Перейдите в «Свойства обозревателя» на вкладке «Подключение», нажмите «Настройки локальной сети» и снимите все галочки.