Получить название сайта SharePoint из консольного приложения

У меня есть консольное приложение, написанное на C#. Мне нужно получить некоторую информацию с сайта SharePoint. Этот экземпляр SharePoint является частью Office 365 (т. е. SharePoint Online).

моя проблема в том, что я не могу использовать вспомогательную библиотеку. Я должен использовать API на основе REST, так как я использую .NET Core.

для начала я зарегистрировал консольное приложение в Azure Active Directory. Это консольное приложение создается в том же Azure Active Directory, что и среда Office 365 часть. Я также предоставил делегированное разрешение "чтение элементов во всех семействах сайтов" для API "Office 365 SharePoint Online" для моего консольного приложения.

в моей ситуации, у меня есть консольное приложение, сидя на сервере. Я настроил тестового пользователя с именем пользователя / паролем на моем клиенте SharePoint. У меня также есть идентификатор клиента для консольного приложения, зарегистрированного в Azure Active Directory, и URL-адрес перенаправления.

в это время у меня есть код, который выглядит так это:

var accessToken = await GetToken(); // retrieves a token from Active Directory
using(var client = new HttpClient()) {
    client
        .DefaultRequestHeaders
        .Clear();

    client
        .DefaultRequestHeaders
        .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    client
        .DefaultRequestHeaders
        .Accept
        .Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var apiUrl = "https://[mySite].sharepoint.com/_api/web";

    // how do I get the title of the site at the apiUrl variable?
}

Я чувствую, что я близок, так как я получаю токен доступа. Я просто не могу понять, как получить название сайта. Как получить название сайта SharePoint из кода на C#?

3 ответов


API REST SharePoint web ресурс включает в себя Title свойство, представляющее заголовок для веб-сайта.

тел.:

GET http://<site url>/_api/web/title

возвращает:

<d:Title xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns:georss="http://www.georss.org/georss" 
    xmlns:gml="http://www.opengis.net/gml">Site Title Goes Here</d:Title>

или, если вы выберите Accept заголовок application/json:

{
  "odata.metadata": 
  "https://microsoft.sharepoint.com/sites/msw/_api/$metadata#Edm.String",
  "value": "MSW"
}

просто понял, что вы используете SharePoint API вместо Graph API, это все еще может быть полезно для вас!

это настройка JSON, вам это не нужно, но это сделает десериализацию проще

public class SharePointSiteObject
{
    [JsonProperty("createdDateTime")]
    public string CreatedDate { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("id")]
    public string ID { get; set; }

    [JsonProperty("lastModifiedDateTime")]
    public string LastModified { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("webUrl")]
    public string WebUrl { get; set; }

    [JsonProperty("displayName")]
    public string DisplayName { get; set; }

    [JsonProperty("createdBy")]
    public user CreatedBy { get; set; }

    [JsonProperty("lastModifiedBy")]
    public user ModifiedBy { get; set; }
}

код для десериализации возвращенного JSON

public static SharePointSiteObject SharePointDeserialize(string jObject)
{
    SharePointSiteObject sharePointSite;

    sharePointSite = JsonConvert.DeserializeObject<SharePointSiteObject>(jObject);

    return sharePointSite;
}

универсальный метод для запроса API Graph, подачи ему конечной точки и токена

public static async Task<string> Run(string url, string token)
{

    var httpClient = new HttpClient();
    HttpResponseMessage response;
    try {
        var request = new HttpRequestMessage(HttpMethod.Get, url);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        response = await httpClient.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();
        return content;
    }
    catch (Exception ex) {
        return ex.ToString();
    }
}

используйте приведенный ниже код, где вы хотите вызвать Graph API и отобразить сайт SharePoint имя

string url = "https://graph.microsoft.com/v1.0/sites/" + sharePointID;
string token = await GetToken();
var request = await Run(url, token);
var result = SharePointDeserialize(request);
Console.WriteLine(result.DisplayName);

вы должны попробовать MS Graph Explorer, это очень полезно:https://developer.microsoft.com/en-us/graph/graph-explorer


конечные точки SharePoint следуют соглашению OData.

Итак, вы можете использовать $select параметры запроса, чтобы указать данные, которые требуется для указанного веб-или списка или поля и т. д.

так, в вашем случае, вы можете просто изменить конечную точку, как показано ниже:

var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title";

в случае, если вы хотите получить дополнительные свойства, такие как описание, логотип, Webtemplate и т. д. вы можете добавить его как:

var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title,Description,
SiteLogoUrl,WebTemplate";

ссылка - список свойств в SPO-Web объект

кроме того, убедитесь, что у вас есть Have full control of all site collections разрешения, зарегистрированного в Office 365 SharePoint Online разрешения, как показано ниже:

enter image description here

полная версия кода, который я использую:

1) Создать AuthenticationResponse.cs класс:

public class AuthenticationResponse
{
        public string token_type { get; set; }
        public string scope { get; set; }
        public int expires_in { get; set; }
        public int expires_on { get; set; }
        public int not_before { get; set; }
        public string resource { get; set; }
        public string access_token { get; set; }
        public string refresh_token { get; set; }
        public string id_token { get; set; }
}

2) Используйте это в своем коде, как показано ниже:

string userName = "user@tenantName.onmicrosoft.com";
string password = "password";

List<KeyValuePair<string, string>> vals = new List<KeyValuePair<string, string>>();

string tenantName = "tenantName.OnMicrosoft.com";
string authString = "https://login.microsoftonline.com/" + tenantName;
string resource = "https://graph.microsoft.com";

AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);

string clientId = "<client-id>";
string key = "<client-secret>";

vals.Add(new KeyValuePair<string, string>("client_id", clientId));
vals.Add(new KeyValuePair<string, string>("resource", resource));
vals.Add(new KeyValuePair<string, string>("username", userName));
vals.Add(new KeyValuePair<string, string>("password", password));
vals.Add(new KeyValuePair<string, string>("grant_type", "password"));
vals.Add(new KeyValuePair<string, string>("client_secret", key));

string url = string.Format("https://login.windows.net/{0}/oauth2/token", tenantName);

using (HttpClient httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
    HttpContent content = new FormUrlEncodedContent(vals);
    HttpResponseMessage hrm = httpClient.PostAsync(url, content).Result;

    AuthenticationResponse authenticationResponse = null;
    if (hrm.IsSuccessStatusCode)
    {
        Stream data = await hrm.Content.ReadAsStreamAsync();
        DataContractJsonSerializer serializer = new
        DataContractJsonSerializer(typeof(AuthenticationResponse));
        authenticationResponse = (AuthenticationResponse)serializer.ReadObject(data);

        var accessToken = authenticationResponse.access_token;

        httpClient
        .DefaultRequestHeaders
        .Clear();

        httpClient
            .DefaultRequestHeaders
            .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        httpClient
            .DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title";      

    }
}