Создание файлов iCal в С#

Я ищу хороший способ создания файла iCalendar (*.ics) в С# (asp.net). Я нашел пару ресурсов, но одна вещь, которой не хватало, - это поддержка полей quoted-printable - с возвратами каретки и линейными каналами.

Например, если поле description неправильно закодировано, отобразится только первая строка и, возможно, будет повреждена остальная информация в файле *.ics.

Я ищу существующие классы, которые могут генерировать *.ics файлы и/или класс, который может генерировать поля quoted-printable.

Ответ 1

Я использую DDay.Ical, его хороший материал. Имеет возможность открыть файл ical и получить его данные в хорошей объектной модели. Он говорит о бета-версии, но он отлично работает для нас.

Изменить ноябрь 2016

Эта библиотека устарела, но была выбрана и переиздана как iCal.NET другим разработчиком.

Заметки о выпуске: rianjs.net/2016/07/dday-ical-is-now-ical-net

Источник на GitHub: github.com/rianjs/ical.net

Ответ 2

Самый простой способ сделать это - разметка HTML с помощью microformats.

Если вы хотите генерировать файлы iCalendar, вы можете использовать hcalendar microformat, а затем включить ссылку, такую ​​как "Добавить в календарь", которая указывает на:

http://feeds.technorati.com/events/[ полный URL вашей страницы, включая http://]

Затем страница Technorati анализирует вашу страницу, извлекает информацию hCalendar и отправляет файл iCalendar клиенту.

Ответ 3

Я написал функцию прокладки, чтобы справиться с этим. В основном это совместимо - единственное зависание в том, что первая строка - 74 символа вместо 75 (74 - для обработки пробела на последующих строках)...

 Private Function RFC2445TextField(ByVal LongText As String) As String

     LongText = LongText.Replace("\", "\\")
     LongText = LongText.Replace(";", "\;")
     LongText = LongText.Replace(",", "\,")

     Dim sBuilder As New StringBuilder
     Dim charArray() As Char = LongText.ToCharArray

     For i = 1 To charArray.Length
         sBuilder.Append(charArray(i - 1))
         If i Mod 74 = 0 Then sBuilder.Append(vbCrLf & " ")
     Next

     Return sBuilder.ToString

 End Function

Я использую это для сводки и описания нашего фида ICS. Просто подайте строку с уже добавленным полем (например, LongText = "SUMMARY: Название события" ). Пока вы устанавливаете кеширование прилично долго, это не слишком дорого для операции.

Ответ 4

iCal (ical 2.0) и кавычки для печати не идут вместе.

Quoted-printable используется в vCal (vCal 1.0) для представления непечатаемых символов, например. линейные разрывы (= 0D = 0A). Кодировка vCal по умолчанию - 7 бит, поэтому иногда вам нужно использовать кавычки для печати без символов ASCII (вы можете переопределить кодировку по умолчанию, но другая, не соответствующая vCal, не должна понимать ее.)

В iCal специальные символы представлены с помощью экранов, например. '\ П'. Кодировка по умолчанию - это UTF-8, все поддерживающие iCal стороны должны поддерживать ее, и это делает ненужным кавычки для печати в iCal 2.0 (и vCard 3.0, если на то пошло).

Возможно, вам понадобится вернуть своего клиента/заинтересованного лица, чтобы уточнить требования. Кажется, существует путаница между vCal и iCal.

Ответ 5

Отъезд http://www.codeproject.com/KB/vb/vcalendar.aspx

Он не обрабатывает поля с кавычками, как вы просили, но остальная часть кода существует и может быть изменена.

Ответ 6

Согласно RFC-2445, поля комментариев и описания являются ТЕКСТ. Правила для тестового поля: [1] Одна строка в поле TEXT не должна превышать 75 октетов. [2] Обертка достигается путем вставки CRLF с последующим пробелом. [3] Существует несколько символов, которые должны быть закодированы, включая\(обратная косая черта); (точка с запятой), (запятая) и новая строка. Использование символа\(обратная косая черта) в качестве разделителя дает \\; \,\n

Пример. Ниже приведен пример свойства с форматированием  разрывы строк в значении свойства:

 DESCRIPTION:Meeting to provide technical review for "Phoenix"
   design.\n Happy Face Conference Room. Phoenix design team
   MUST attend this meeting.\n RSVP to team leader.

Ответ 7

iCal может быть сложным, поэтому я рекомендую использовать библиотеку. DDay - хорошее бесплатное решение. Последнее, что я проверил, у него не было полной поддержки повторяющихся событий, но кроме этого это выглядит очень хорошо. Определенно проверяйте календари несколькими клиентами.

Ответ 8

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

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Calendly//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTAMP:20170509T164109Z
UID:your id-11273661
DTSTART:20170509T190000Z
DTEND:20170509T191500Z
CLASS:PRIVATE
DESCRIPTION:Event Name: 15 Minute Meeting\nDate & Time: 03:00pm - 03:15pm (
 Eastern Time - US & Canada) on Tuesday\, May 9\, 2017\n\nBest Phone Number
  To Reach You :: xxxxxxxxx\n\nany "link": https://wwww.yahoo.com\n\n
SUMMARY:15 Minute Meeting
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

это сработало для меня.

Ответ 9

Мне не хватает примера с часовыми поясами. Итак, вот фрагмент, который показывает, как вы можете установить часовой пояс в ics (и отправить его в браузер в asp.net).

//set a couple of variables for demo purposes
DateTime IcsDateStart = DateTime.Now.AddDays(2);
DateTime IcsDateEnd = IcsDateStart.AddMinutes(90);
string IcsSummary = "ASP.Net demo snippet";
string IcsLocation = "Amsterdam (Netherlands)";
string IcsDescription = @"This snippes show you how to create a calendar item file (.ics) in ASP.NET.\nMay it be useful for you.";
string IcsFileName = "MyCalendarFile";

//create a new stringbuilder instance
StringBuilder sb = new StringBuilder();

//begin the calendar item
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:stackoverflow.com");
sb.AppendLine("CALSCALE:GREGORIAN");
sb.AppendLine("METHOD:PUBLISH");

//create a custom time zone if needed, TZID to be used in the event itself
sb.AppendLine("BEGIN:VTIMEZONE");
sb.AppendLine("TZID:Europe/Amsterdam");
sb.AppendLine("BEGIN:STANDARD");
sb.AppendLine("TZOFFSETTO:+0100");
sb.AppendLine("TZOFFSETFROM:+0100");
sb.AppendLine("END:STANDARD");
sb.AppendLine("END:VTIMEZONE");

//add the event
sb.AppendLine("BEGIN:VEVENT");

//with a time zone specified
sb.AppendLine("DTSTART;TZID=Europe/Amsterdam:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
sb.AppendLine("DTEND;TZID=Europe/Amsterdam:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));

//or without a time zone
//sb.AppendLine("DTSTART:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
//sb.AppendLine("DTEND:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));

//contents of the calendar item
sb.AppendLine("SUMMARY:" + IcsSummary + "");
sb.AppendLine("LOCATION:" + IcsLocation + "");
sb.AppendLine("DESCRIPTION:" + IcsDescription + "");
sb.AppendLine("PRIORITY:3");
sb.AppendLine("END:VEVENT");

//close calendar item
sb.AppendLine("END:VCALENDAR");

//create a string from the stringbuilder
string CalendarItemAsString = sb.ToString();

//send the ics file to the browser
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/calendar";
Response.AddHeader("content-length", CalendarItemAsString.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=\"" + IcsFileName + ".ics\"");
Response.Write(CalendarItemAsString);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();