Удалить событие Ical не работает

Я динамически создаю событие ical в своем веб-приложении, и когда кто-то отменяет встречу в приложении, мы генерируем файл ical event *.ics для своей электронной почты, чтобы удалить событие в своем календаре.

Создание работает отлично, но когда мы пытаемся удалить созданную встречу, она не удаляется из календаря.

Создание кода события Ical:

 string[] contents = { 
      "BEGIN:VCALENDAR",
      "VERSION:2.0",
      "PRODID:-//dev.com//iCal//EN",
      "X-WR-CALNAME:development",
      "X-WR-RELCALID:928C8448-048A-4aa2-BE27-A920773AF3DC",
      "X-FUNAMBOL-ALLDAY:0",
      "METHOD:REQUEST",
      "BEGIN:VEVENT",
      "UID:" + Args.EventUID, 
      "SEQUENCE:1",
      "DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"), 
      "DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"), 
      "LOCATION: " + Args.EventLocation, 
      "ORGANIZER: test@outlook.com",
      "DESCRIPTION;ENCODING=ESCAPED-CHAR:" + Args.EventName,
      "SUMMARY:" + Args.EventDescription, 
      "STATUS:CONFIRMED",
      "TRANSP:OPAQUE",
      "PRIORITY:" + Args.EventPriority.ToString(), 
      "END:VEVENT", 
      "END:VCALENDAR" 
 }; 

Создание события отлично работает на iphone / android / outlook

Удалить часть события:

    string[] contents = { 
      "BEGIN:VCALENDAR",
      "VERSION:2.0",
      "METHOD:CANCEL",
      "X-WR-CALNAME:development",
      "X-WR-RELCALID:928C8448-048A-4aa2-BE27-A920773AF3DC",
      "PRODID:-//dev.com//iCal//EN",
      "X-FUNAMBOL-ALLDAY:0",
      "BEGIN:VEVENT",                                
      "UID:" + Args.EventUID,
      "SEQUENCE:2",
      "DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"), 
      "DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"), 
      "LOCATION: " + Args.EventLocation, 
      "DESCRIPTION;ENCODING=ESCAPED-CHAR:" + Args.EventName,
      "SUMMARY:" + Args.EventDescription, 
      "ORGANIZER: test@outlook.com",
      "PRIORITY:" + Args.EventPriority.ToString(), 
      "STATUS:CANCELLED",
      "TRANSP:OPAQUE",
      "END:VEVENT", 
      "END:VCALENDAR" 
  };

Когда я щелкаю этот файл, созданный для удаления уже созданного события, он не удаляет событие, а иногда дублирует событие.

Фактический UID при создании и удалении одинаков.

3 ответа

Попробуйте использовать PUBLISH как METHOD а также 0 как SEQUENCE для подачи и 1 как SEQUENCE для стирания.

Пример подачи заявки:

string[] contents = {
"BEGIN:VCALENDAR",
"VERSION:2.0",
"PRODID:-//site.domain//iCal//EN",
"METHOD:PUBLISH",
"BEGIN:VEVENT",
"UID:" + Args.EventUID,
"SEQUENCE:0",
"DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"),
"DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"),
"SUMMARY:" + Args.EventDescription,
"STATUS:CONFIRMED",
"END:VEVENT",
"END:VCALENDAR"
};

Пример стирания:

string[] contents = {
"BEGIN:VCALENDAR",
"VERSION:2.0",
"PRODID:-//site.domain//iCal//EN",
"METHOD:CANCEL",
"BEGIN:VEVENT",
"UID:" + Args.EventUID,
"SEQUENCE:1",
"DTSTART:" + Args.EventStartTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"),
"DTEND:" +  Args.EventEndTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"),
"SUMMARY:" + Args.EventDescription,
"STATUS:CANCELLED",
"END:VEVENT",
"END:VCALENDAR"
};

Разница также может заключаться в том, что приложение календаря "подписало" или "импортировало" файл ics? Подписанные события должны обновляться, импортированные, как правило, могут отсутствовать, так как пользователь мог их изменить - могут отличаться в разных приложениях календаря.

Во-первых, внимательно изучите UID. Я знаю, вы говорите, что они одинаковы, но проверьте! Пробелы? Случай?

Затем, поместите PRODID во вторую строку, сразу после BEGIN (игнорируйте валидаторы, когда они говорят, что вы должны указывать VERSION во второй строке.) Это звучит тривиально, поле даже не используется, но Outlook, в частности, смехотворно придирчив. Скопируйте рабочий пример. Проверь и скажи мне, если я не прав.

Затем SEQUENCE индексируется с 0. Клиенты могут интерпретировать SEQUENCE:1 как обновление и спрашивать, где находится исходное приглашение.

Затем проверьте структуру и заголовки MIME-типов ваших писем. Я получил лучшие результаты, отправив простое одночастное электронное письмо с Content-type: text/calendar; method="[REQUEST/CANCEL]" в заголовке MIME.

До сих пор не работает? Попробуйте добавить элемент ATTENDEE с обязательным участием, true rsvp и т. Д., Повторив адрес электронной почты получателя.

Все еще проблемы? Используйте онлайн-валидаторы Icalendar, чтобы проверить вывод, а также скопировать точно рабочий пример. Отправьте себе приглашение, затем отмените его из Gmail и / или Outlook. Все важно - структура сообщения, порядок полей в Icalendar, заголовки MIME электронной почты. Отправка в GMail позволяет точно узнать, что было получено, с помощью опции gmail show original.

Я заметил, что вы ничего не делаете для упаковки. Цветные строки ограничены 75 символами, не так много, а переполненные строки должны начинаться с пробела. Валидатор быстро скажет вам.

Другие вопросы по тегам