Обзор SharePoint Education. Часть 3
Третья часть обзора SharePoint Education, посвященная API.

Веб-сервис
SharePoint Education содержит замечательный сервис, доступный по адресу вида: http://speduapp/_vti_bin/edu/Data.svc.
Сервис DataProvider содержит два метода: ProcessGetRequest, ProcessPostRequest. Оба метода принимают единственный параметр типа Request.
Запросы могут быть трех видов: DataLayerRequest, ApplicationLayerRequest, BulkRequest:

Полная иерархия дочерних классов Request выглядит вот так:
- DataLayerRequest- DataLayerReadRequest- GetEntitiesByTypeRequest
 
 
- DataLayerReadRequest
- ApplicationLayerRequest- ApplicationLayerReadRequest- GetCurrentUserRequest
- IsAListRefreshingRequest
 
- ApplicationLayerWriteRequest- AddRequest
- ChangeRequest
- CompleteCopyRequest
- CopyDocumentByUrlRequest
- CopyDocumentRequest
- CopyRequest
- PublishGradesRequest
- RemoveRequest
 
 
- ApplicationLayerReadRequest
- BulkRequest
Все варианты я описывать не буду, покажу пару примеров использования сервиса для работы с SharePoint Education.
Базовый класс Request содержит обязательное свойство Context. Для начала про него необходимо знать только то, что указание локали обязательно:
// Контекст запроса
var requestContext = new DataLayerRequestContext
{
    Locale = CultureInfo.CurrentCulture.Name
};
При использовании DataLayerRequest необходимо использовать контекст типа DataLayerRequestContext (наследник RequestContext). В этом случае в контексте можно указывать дополнительные параметры:
- ForceCacheExpireField
- ForceSearchReadField
- ForceSpReadField
- ForceUdwReadField
Если первые три интуитивно понятны, то последний для меня остается загадкой.
Получение текущего пользователя
Самый простой сценарий: получение информации о текущем пользователе:
// Запрос
var userRequest = new GetCurrentUserRequest
{
    // Контект запроса
    Context = new DataLayerRequestContext
    {
        Locale = CultureInfo.CurrentCulture.Name
    }
};
// Получение ответа. Ожидаем EntityResponse
var response = client.ProcessGetRequest(userRequest) as EntityResponse;
if (response != null)
{
    // Первая сущность коллекции в ответе сервера
    var entity = response.Entities[0];
    // Приводим к типу User
    var user = entity as User;
    if (user != null)
    {
        // TODO
    }
}
Еще диаграмма для понимания связи и содержания классов Entity и User.

Второй пример посложней
Получение сущностей из SharePoint Education
Теперь получим коллекцию курсов с помощью запроса типа GetEntitiesByTypeRequest. Типы сущностей (Entity) в SharePoint Education все кроме пользователей описываются соответствующими типами содержимого:
| Entity | EntityType | 
|---|---|
| AcademicDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD7208554 | 
| Announcement | 0x0104008A4047FFBB374E0A8932030BE989F795 | 
| AssignedAssignment | 0x0108005CBC699A566E11E0A996B888DFD7208551 | 
| Assignment | 0x010063C2F478ACC511DFB869B5BFDFD720851252 | 
| AssignmentCategory | 0x010063C2F478ACC511DFB869B5BFDFD720851256 | 
| AssignmentGrade | 0x010063C2F478ACC511DFB869B5BFDFD72085125551 | 
| Community | 0x010063C2F478ACC511DFB869B5BFDFD7208511 | 
| CommunityEntity | 0x010063C2F478ACC511DFB869B5BFDFD7208512 | 
| CommunityMembership | 0x010027FC2137D8DE4B00A40E14346D070D5201 | 
| CopyWorkItem | 0x010063C2F478ACC511DFB869B5BFDFD72085120101 | 
| Course | 0x010063C2F478ACC511DFB869B5BFDFD720851101 | 
| CourseGrade | 0x010063C2F478ACC511DFB869B5BFDFD72085125552 | 
| Document | 0x0101008DA831F4ACC511DF8205CDBFDFD72085 | 
| DocumentFolder | 0x012000324696745BE411E0A68280E7DFD7208551 | 
| DocumentLookup | 0x01010A00256755BE5C9E11E09BD59556DFD7208552 | 
| EduDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD72085 | 
| Entity | 0x010063C2F478ACC511DFB869B5BFDFD72085 | 
| Event | 0x0102001E41EAB6184B11E0AE8631B7DFD7208553 | 
| EventSchedule | 0x0102001E41EAB6184B11E0AE8631B7DFD7208554 | 
| FeedbackDocument | 0x0101008DA831F4ACC511DF8205CDBFDFD7208552 | 
| Grade | 0x010063C2F478ACC511DFB869B5BFDFD720851255 | 
| Lesson | 0x010063C2F478ACC511DFB869B5BFDFD720851251 | 
| Link | 0x01010A00256755BE5C9E11E09BD59556DFD7208551 | 
| Meeting | 0x0102001E41EAB6184B11E0AE8631B7DFD720855351 | 
| MeetingSchedule | 0x0102001E41EAB6184B11E0AE8631B7DFD720855451 | 
| Submission | 0x010063C2F478ACC511DFB869B5BFDFD720851254 | 
| User | User | 
| UserCommunityMembership | 0x01002DC5EE125BEC11E093DEDDF0DFD72086 | 
| WorkItem | 0x010063C2F478ACC511DFB869B5BFDFD720851201 | 
При формировании запроса помимо обязательного параметра EntityType можно также указать свойство Query, которое используется для фильтрации и сортировки запрашиваемых данных.

С сортировкой всё просто: указываем поля и направление сортировки. Что касается фильтрации, то CAML-запросы в SharePoint Education инкапсулированы в FilterExpression:

На мой взгляд замечательная реализация.
В примере я создал запрос для выбора всех активных курсов:
using (var client = new DataProviderClient(binding))
{
    // Course ContentTypeId
    var courseEntityTypeId = "0x010063C2F478ACC511DFB869B5BFDFD720851101";
    // Parameter Context.Locale is required
    var courseRequestContext = new RequestContext
    {
        Locale = CultureInfo.CurrentCulture.Name
    };
    // Request
    var courseRequest = new GetEntitiesByTypeRequest
    {
        Context = courseRequestContext,
        EntityType = courseEntityTypeId,
        Query = new Query
        {
            Filter = new ConditionFilterExpression
            {
                Field = "Status",
                Operator = ConditionFilterOperator.EQ,
                Value = "Active"
            }
        }
    };
    // Response
    var courseResponse = client.ProcessGetRequest(courseRequest);
    // List of courses
    var courses = ((EntityResponse)courseResponse)
        .Entities
        .Cast<Course>();
}
Все остальные запросы строятся аналогично, принципиальных отличий нет. Пробуйте.
 
 























































































