Создание файлов iCal в C#
Я ищу хороший метод создания файла iCalendar (*.ics) в C# (asp.net). Я нашел пару ресурсов, но одной вещи, которой не хватало, это их поддержка полей для печати в кавычках - полей, которые имеют возврат каретки и перевод строки.
Например, если поле описания не закодировано должным образом, будет отображаться только первая строка, что может привести к повреждению остальной информации в файле *.ics.
Я ищу существующие классы, которые могут генерировать файлы *.ics и / или класс, который может генерировать поля для печати в кавычках.
9 ответов
Я использую DDay.Ical, это хороший материал. Имеет возможность открывать файл и получать его данные в красивой объектной модели. Там написано бета, но у нас это отлично работает.
Редактировать ноябрь 2016
Эта библиотека устарела, но другой разработчик взял ее и переиздал как iCal.NET.
Заметки о выпуске: http://rianjs.net/2016/07/dday-ical-is-now-ical-net
Источник на GitHub: https://github.com/rianjs/ical.net
Самый простой способ сделать это - разметить ваш HTML с помощью микроформатов.
Если вы хотите сгенерировать файлы iCalendar, вы можете использовать микроформат hCalendar, а затем добавить ссылку, например "Добавить в календарь", которая указывает на:
http://feeds.technorati.com/events/[ полный URL-адрес вашей страницы, включая http: //]
Затем страница Technorati анализирует вашу страницу, извлекает информацию hCalendar и отправляет файл iCalendar клиенту.
Я написал функцию подкладки, чтобы справиться с этим. Это в основном соответствует требованиям - единственное зависание в том, что первая строка содержит 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:Event Title"). Пока вы устанавливаете кеширование прилично долго, это не слишком дорогая операция.
iCal (ical 2.0) и цитируемая версия не совместимы.
Quoted-printable часто используется в vCal (vCal 1.0) для представления непечатаемых символов, например, разрывов строк (=0D=0A). Кодировка vCal по умолчанию является 7-битной, поэтому иногда вам нужно использовать quoted-printable для представления символов, отличных от ASCII (вы можете переопределить кодировку по умолчанию, но другой стороне, поддерживающей vCal, не требуется ее понимать).
В iCal специальные символы представлены с помощью escape-символов, например '\n'. Кодировка по умолчанию - UTF-8, все стороны, поддерживающие iCal, должны поддерживать его, и это делает вывод на печать в кавычках совершенно ненужным в iCal 2.0 (и в этом случае vCard 3.0).
Возможно, вам придется поддержать вашего клиента / заинтересованного лица, чтобы уточнить требования. Кажется, что существует путаница между vCal и iCal.
Мне не хватает примера с пользовательскими часовыми поясами. Итак, вот фрагмент, который показывает, как вы можете установить часовой пояс в 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:stackru.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();
Проверьте http://www.codeproject.com/KB/vb/vcalendar.aspx
Он не обрабатывает поля для печати в кавычках, как вы просили, но остальная часть кода есть и может быть изменена.
Согласно RFC-2445, поля комментариев и описания являются ТЕКСТНЫМИ. Правила для тестового поля: [1] Одна строка в текстовом поле не должна превышать 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.
Я знаю, что уже слишком поздно, но это может помочь другим. в моем случае я написал следующий текстовый файл с расширением.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
это сработало для меня.
iCal может быть сложным, поэтому я рекомендую использовать библиотеку. DDay - хорошее бесплатное решение. В прошлый раз я проверил, что он не имеет полной поддержки повторяющихся событий, но кроме этого он выглядит действительно хорошо. Обязательно протестируйте календари с несколькими клиентами.