2016-02-18 3 views
2

Je tente de créer un événement via l'API Microsoft Graph en invitant des utilisateurs en tant que participants. Le code pour définir les participants est la suivante:Microsoft.Graph.AttendeeType non énuméré correctement

var attendees = new List<Microsoft.Graph.Attendee>(); 
     foreach (var e in emailAddresses) 
     { 
      var userProfile = await AzureGraph.GetOtherUserProfile(e); 
      if (e != currentUserEmail.First()) 
      { 
       Microsoft.Graph.EmailAddress email = new Microsoft.Graph.EmailAddress(); 
       email.Name = userProfile.DisplayName; 
       email.Address = e; 
       attendees.Add(new Microsoft.Graph.Attendee() 
       { 
        EmailAddress = email, 
        Type = Microsoft.Graph.AttendeeType.Optional 
       }); 
      } 
     } 

await AzureGraph.AddEvent(new Microsoft.Graph.Event 
     { 
      Subject = string.Format("Follow Up: {0}", Id), 
      Body = new Microsoft.Graph.ItemBody 
      { 
       Content = "content" 
      }, 
      Start = start, 
      End = start.AddMinutes(30), 
      Attendees = attendees 
     }); 

Toutefois, lorsque vous effectuez la demande, j'obtiens une réponse de demande incorrecte. La raison en est que le 'Type' d'un participant est un n enum de Microsoft.Graph.AttendeeType et qu'il n'est pas énuméré correctement. Par conséquent, il tente d'envoyer à travers la valeur numérique '1' au lieu de la valeur de chaîne "Facultatif" en provoquant l'échec.

J'ai été en mesure de confirmer cela en utilisant fiddler, si je change manuellement la valeur numérique à la valeur de la chaîne alors cela ne pose aucun problème.

Est-ce que quelqu'un a trouvé cela ou a des idées pour résoudre ce problème?

Merci beaucoup pour votre aide à l'avance :)

Répondre

2

J'ai maintenant réussi à résoudre ce problème. La solution est un peu un hack mais ça marche. Mon code d'appel original était comme suit:

public static async Task AddEvent(Event e) 
{ 
    using (var client = new HttpClient()) 
    { 
    using (var req = new HttpRequestMessage(HttpMethod.Post, _calendarUrl)) 
    { 
     var token = await GetToken(); 
     req.Headers.Add("Authorization", string.Format("Bearer {0}", token)); 
     req.Headers.TryAddWithoutValidation("Content-Type", "application/json"); 

     var requestContent = JsonConvert.SerializeObject(new 
     { 
      Subject = e.Subject, 
      Body = new 
      { 
       ContentType = "HTML", 
       Content = e.Body.Content 
      }, 
      Start = new 
      { 
       DateTime = e.Start, 
       TimeZone = "UTC" 
      }, 
      End = new 
      { 
       DateTime = e.End, 
       TimeZone = "UTC" 
      } 
     }); 
     req.Content = new StringContent(requestContent, Encoding.UTF8, "application/json"); 
     using (var response = await client.SendAsync(req)) 
     { 
      if (response.IsSuccessStatusCode) 
      { 
       return; 
      } 
      else 
      { 
       throw new HttpRequestException("Event could not be added to calendar"); 
      } 
     } 
    } 
} 
} 

J'ai changé cela:

public static async Task AddEvent(Event e) 
    { 
     using (var client = new HttpClient()) 
     { 
      using (var req = new HttpRequestMessage(HttpMethod.Post, _calendarUrl)) 
      { 
       var token = await GetToken(); 
       req.Headers.Add("Authorization", string.Format("Bearer {0}", token)); 
       req.Headers.TryAddWithoutValidation("Content-Type", "application/json"); 

       IList<Attendee> attendees = new List<Attendee>(); 

       foreach(var a in e.Attendees) 
       { 
        attendees.Add(new Attendee() 
        { 
         EmailAddress = a.EmailAddress, 
         Type = Enum.GetName(typeof(AttendeeType), AttendeeType.Optional) 
        }); 
       } 

       var requestContent = JsonConvert.SerializeObject(new 
       { 
        Subject = e.Subject, 
        Body = new 
        { 
         ContentType = "HTML", 
         Content = e.Body.Content 
        }, 
        Start = new 
        { 
         DateTime = e.Start, 
         TimeZone = "UTC" 
        }, 
        End = new 
        { 
         DateTime = e.End, 
         TimeZone = "UTC" 
        }, 
        Attendees = attendees 
       }); 
       req.Content = new StringContent(requestContent, Encoding.UTF8, "application/json"); 
       using (var response = await client.SendAsync(req)) 
       { 
        if (response.IsSuccessStatusCode) 
        { 
         return; 
        } 
        else 
        { 
         throw new HttpRequestException("Event could not be added to calendar"); 
        } 
       } 
      } 
     } 
    } 

En plus d'ajouter la classe locale suivante:

private class Attendee 
    { 
     public EmailAddress EmailAddress { get; set; } 
     public string Type { get; set; } 
    } 

Essentiellement, le ParticiPant Graphique
1. un objet EmailAddress contenant Name (chaîne) et Email (chaîne).
2. un objet Type de type AttendeeType dont l'enum n'a pas été transmis correctement.

Par conséquent, j'ai créé ma propre version de la classe Attendee pour contenir le même objet EmailAddress et le même type de chaîne de caractères que l'API s'attend à ce qu'il soit. J'ai alors dû changer le type enum en nom de l'enum plutôt que de la valeur int. Cela a été fait comme suit:

attendees.Add(new Attendee() 
{ 
    EmailAddress = a.EmailAddress, 
    Type = Enum.GetName(typeof(AttendeeType), AttendeeType.Optional) 
}); 

Cela m'a donné la valeur « facultative » plutôt que 1 qui fait acceptable pour l'API.

J'espère que cela aidera quelqu'un dans le futur.

Il semble que Microsoft ait négligé d'utiliser une énumération dans le code et d'attendre une chaîne au lieu d'un entier dans l'API, et je pense que cela doit être résolu.