Назначить менеджера с помощью клиентской библиотеки Microsoft Graph .NET

Может кто-нибудь подсказать, как настроить поле User.Manager с помощью клиентской библиотеки Microsoft Graph .NET? Я знаю, как сделать это с помощью прямого вызова REST, но хочу как можно больше избегать этих вызовов (в обход оболочки). С кодом ниже я смог очистить свойство менеджера.

client = new GraphClient(...);
var builder = new DirectoryObjectWithReferenceRequestBuilder(
    client.Users["<userid>"].Manager.Request().RequestUrl,client
);
builder.Request().DeleteAsync().Wait()

Однако я все еще не могу понять, какой класс позволяет мне создать запрос PUT для ссылки на член ( как описано здесь). Я попытался следующий код:

var mgr = new DirectoryObject();
mgr.Id = "<Id of the user that should be set as manager>";

var usrPatch = new User();
usrPatch.Manager = mgr;

client.Users["<Id of the user to be updated>"].Request().UpdateAsync(usrPatch).Wait();

Этот код не вызывает исключения, но он также не обновляет менеджер. Запрос неверный. Приведенный выше код отправляет PATCH вместо PUT в "базовый" объект.

Запрос сгенерирован кодом выше:

PATCH https://graph.microsoft.com/v1.0/users/[Id обновляемого пользователя] HTTP/1.1
SdkVersion: graph-dotnet-1.0.1 
Тип контента: приложение / JSON 
Хост: graph.microsoft.com 
Длина контента: 45 Ожидание: 100- продолжение

{"id":"[Идентификатор пользователя, который должен быть установлен в качестве менеджера]"}

Ответ 204.

2 ответа

Решение

Я вижу следующее, чтобы удалить менеджера:

graphClient.Users[newUser.Id].Manager.Reference.Request().DeleteAsync();

Но у нас должно быть что-то вроде следующего, чтобы назначить менеджера:

graphClient.Users[newUser.Id].Manager.Reference.Request().AddAsync(manager);

Я сообщу об ошибке и обновлю, когда исправлю.

Два года спустя, и это все еще не работает.

Я получаю следующее исключение при использовании await graphClient.Users[user.Id].Manager.Request().UpdateAsync(usrPatch);

Microsoft.Graph.ServiceException: 'Code: BadRequest
Message: Write requests are only supported on contained entities

Мне пришлось использовать обходную логику Стефбо для обновления менеджера.

Microsoft.Graph DLL Версия 1.12.

Используйте PutAsync(), чтобы установить менеджер с помощью библиотеки графиков: graphClient.Users[user.Id].Manager.Reference.Request().PutAsync(manager.Id);

Обходной путь до обновления "менеджер" полностью поддерживается:

var authToken = "<get your token here>";
var client = new GraphClient(...);

var usrId = "<id of the user to update>"
var mgrId = "<id of the manager>"

var url = client.Users[usrId].Manager.Reference.Request().RequestUrl;

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", authToken);

var content = new StringContent(
    client.HttpProvider.Serializer.SerializeObject(
        new ReferenceRequestBody
        {
            ODataId =
                $"{client.BaseUrl}/directoryObjects/{mgrId}"
        }),
    Encoding.Default,
    "application/json");

var resp = httpClient.PutAsync(url, content).Result;
if (!resp.IsSuccessStatusCode)
{
    // throw exception/log etc
}
Другие вопросы по тегам