Bonjour,

J'ai réussi sans trop de problèmes à créer un lien vers ma webapi v2 pour qu'elle retourne un stream au format ICal grace à un BufferedMediaTypeFormatter:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
  public class iCalFormatter : BufferedMediaTypeFormatter
    {
        public iCalFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/iCal"));
 
        }
 
        public override bool CanReadType(Type type)
        {
            return false;
        }
 
        public override bool CanWriteType(Type type)
        {
            if (type == typeof(AppointmentModel))
            {
                return true;
            }
            else
            {
                Type enumerableType = typeof(IEnumerable<AppointmentModel>);
                return enumerableType.IsAssignableFrom(type);
            }
        }
 
        public override void WriteToStream(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content)
        {
            using (var writer = new StreamWriter(writeStream))
            {
                writer.WriteLine("BEGIN:VCALENDAR");
                writer.WriteLine("VERSION:2.0");
                writer.WriteLine("X-WR-CALNAME:MyCAL");
                writer.WriteLine("X-PUBLISHED-TTL:PT1H");
                var appointments = value as IEnumerable<AppointmentModel>;
                if (appointments != null)
                {
                    foreach (var appointment in appointments)
                    {
                        WriteAppointment(appointment, writer);
                    }
                }
                else
                {
                    var singleAppointment = value as AppointmentModel;
                    if (singleAppointment == null)
                    {
                        throw new InvalidOperationException("Cannot serialize type");
                    }
                    WriteAppointment(singleAppointment, writer);
                }
                writer.WriteLine("END:VCALENDAR");
            }
            writeStream.Close();
        }
 
        private void WriteAppointment(AppointmentModel appointment, StreamWriter writer)
        {
            writer.WriteLine("BEGIN:VEVENT");
            writer.WriteLine("UID:" + appointment.Id);
            writer.WriteLine("DTSTART:" + string.Format("{0:yyyyMMddTHHmmssZ}", appointment.From));
            writer.WriteLine("DTEND:" + string.Format("{0:yyyyMMddTHHmmssZ}", appointment.Until));
            writer.WriteLine("SUMMARY:" + appointment.Title);
            writer.WriteLine("END:VEVENT");
        }
    }
Et dans le controller :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
  public class AppointmentsController  : ApiController
    {
        public IEnumerable<AppointmentModel> Get()
        {
            List<AppointmentModel> models = new List<AppointmentModel>();
            using (var context = new AppointmentsEntities())
            {               
                var appointments = context.Appointments;
                foreach (var appointment in appointments)
                {
                    models.Add(new AppointmentModel
                    {
                        Id = appointment.Id,
                        Description = appointment.Description,
                        From = appointment.From,
                        Location = appointment.Location,
                        Title = appointment.Title,
                        Until = appointment.Until
                    });
                }
            }
            return models;
        }
}
L'intégration avec Outlook se passe très bien mais... le calendrier est marqué en lecture seul.

D'après ce que j'ai compris, pour la mise à jour du calendrier via Outlook il faut que le serveur soit webdav pour que la messagerie "envoi" un fichier d'extension .ics au serveur.

Si vous pouviez me guider sur le comment faire pour transformer ma webapi v2 en serveur webdav en sachant qu'elle est hébergé sur un azure web site ?

Dans mon esprit j'imagine qu'il s'agit de créer une méthode POST (ou PUT/PATCH?) qui recevra le fichier.

Je pense aussi qu'il me manque certaines configurations dans mon fichier ICAl pour qu'Outlook considère mon serveur comme "éditable" et donc qu'il ne passe pas le calendrier en lecture seul (surement des ajouts dans le header)?

Dans le principe, je souhaite fournir un moyen de créer des rendez-vous via mon api (dirigée par un site web mvc indépendant), mais aussi de pouvoir recevoir les rendez-vous modifiés/ajoutés par les collaborateur directement depuis leur calendrier Outlook.

Chaque utilisateur aura un lien unique (via un GUID) vers son calendrier.

J'ai beaucoup de mal à comprendre comment fonctionne la synchronisation d'Outlook avec les fichiers .ics, je sais qu'il récupère à intervalle régulier le flux (ou fichier) en fonction du paramètre : "X-PUBLISHED-TTL:PT1H" (1H dans le cas présent), mais qu'en est-il de l'envoi de nouvelles informations vers le serveur ?

Quel propriété(s) lui permet de décider que le calendrier sera transmis au serveur pour mise à jour ?

Merci de m'éclairer sur ce sujet car pour le moment je n'arrive pas bien à cerner où je dois aller.