Some time ago we faced with interesting problem: when tried to update group using UnifiedGroupsUtility.UpdateUnifiedGroup() method from OfficeDevPnP we got the following error:
HTTP/1.1 400 Bad Request ef { "error": { "code": "Request_BadRequest", "message": "Invalid property 'responseHeaders'.", "innerError": { "request-id": "...", "date": "..." } } }
Under the hood this method uses .Net Graph client library:
var graphClient = CreateGraphClient(accessToken, retryCount, delay); var groupToUpdate = await graphClient.Groups[groupId] .Request() .GetAsync(); if (!String.IsNullOrEmpty(description) && groupToUpdate.Description != description) { groupToUpdate.Description = description; updateGroup = true; } bool existingIsPrivate = groupToUpdate.Visibility == "Private"; if (existingIsPrivate != isPrivate) { groupToUpdate.Visibility = isPrivate == true ? "Private" : "Public"; updateGroup = true; } if (updateGroup) { var updatedGroup = await graphClient.Groups[groupId] .Request() .UpdateAsync(groupToUpdate); }
When I checked in Fiddler request details of UpdateAsync() call I found that JSON representation of group object which is passed to HTTP PATCH method really has responseHeaders property:
PATCH https://graph.microsoft.com/v1.0/groups/{id} { "classification": "Internal", "createdDateTime": "...", "description": "test", "displayName": "...", "groupTypes": [ "Unified" ], "mail": "...", "mailEnabled": true, "mailNickname": "...", "proxyAddresses": [ "SMTP:..." ], "renewedDateTime": "...", "securityEnabled": false, "visibility": "Public", "id": "...", "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#groups/$entity", "deletedDateTime": null, "onPremisesLastSyncDateTime": null, "onPremisesProvisioningErrors": [], "onPremisesSecurityIdentifier": null, "onPremisesSyncEnabled": null, "preferredDataLocation": null, "resourceBehaviorOptions": [], "resourceProvisioningOptions": [], "responseHeaders": { "Transfer-Encoding": [ "chunked" ], "request-id": [ "..." ], "client-request-id": [ "..." ], "x-ms-ags-diagnostic": [ ... ], "OData-Version": [ "4.0" ], "Duration": [ "100.3015" ], "Strict-Transport-Security": [ "max-age=31536000" ], "Cache-Control": [ "private" ], "Date": [ "..." ] }, "statusCode": "OK" }
Not sure why responseHeaders property is now added to the group object when it is first returned from graph. In order to avoid this error I used the following workaround: construct new Group object, specify group id and only those properties which should be updated. I.e. update object with minimal required specified properties:
var graphClient = CreateGraphClient(accessToken); var existingGroup = await graphClient.Groups[groupId].Request().GetAsync(); var groupToUpdateMinimal = new Group(); groupToUpdateMinimal.Id = groupId; bool updateGroup = false; if (!string.IsNullOrEmpty(description) && existingGroup.Description != description) { groupToUpdateMinimal.Description = description; updateGroup = true; } bool existingIsPrivate = existingGroup.Visibility == "Private"; if (isPrivate != null && existingIsPrivate != isPrivate.Value) { groupToUpdateMinimal.Visibility = isPrivate.Value ? "Private" : "Public"; updateGroup = true; } if (updateGroup) { await graphClient.Groups[groupId].Request().UpdateAsync(groupToUpdateMinimal); }
In this case only id, description and visibility properties are passed to HTTP PATCH method:
{ "description": "test", "visibility": "Public", "id": "..." }
and group is successfully updated.
No comments:
Post a Comment