Створення файлів iCal у C #


76

Я шукаю хороший метод генерації файлу iCalendar (* .ics) у c # (asp.net). Я знайшов кілька ресурсів, але одне, чого не вистачало, - це підтримка полів, що друкуються у цитатах - полів, що мають повернення каретки та стрічки.

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

Я шукаю існуючі класи, які можуть генерувати файли * .ics та / або клас, який може генерувати поля, що друкуються у цитатах .


8
Незважаючи на те, що це питання трапилось давно, я думав зазначити, що поля, що друкуються у цитатах, не є частиною стандарту iCalendar (vCalendar 2.0). Вони є частиною стандарту vCalendar (vCalendar 1.0), який сьогодні рідко (якщо взагалі колись) використовується. iCalendar має власний метод захисту даних, який набагато чистіший та простіший для інтерпретації, ніж цитований.
Даг

Відповіді:


73

Я використовую DDay.Ical , його хороші речі. Має можливість відкрити ical-файл і отримати його дані в приємній об'єктній моделі. Там написано бета-версія, але вона чудово працює для нас.

Редагувати листопад 2016 р

Цю бібліотеку застаріло, але інший розробник взяв і перевипустив як iCal.NET.

Примітки щодо випуску: rianjs.net/2016/07/dday-ical-is-now-ical-net

Джерело на GitHub: github.com/rianjs/ical.net


12

Найпростіший спосіб зробити це - це розмітка HTML-коду за допомогою мікроформатів .

Якщо ви хочете створити файли iCalendar, тоді ви можете використовувати мікроформат hCalendar, а потім включити посилання, наприклад, "Додати до календаря", яке вказує на:

http://feeds.technorati.com/events/ [ повна URL-адреса вашої сторінки, включаючи http: //]

Потім сторінка Technorati аналізує вашу сторінку, витягує інформацію hCalendar і надсилає файл iCalendar клієнту.


3
Цей метод використовується NerdDinner.com і, здається, працює досить добре. Тим НЕ менше, я повинен дати +1 за DDay.iCal (хоча я упереджено) :)
Дуга

Мені не подобається цей метод, це те, що Technorati може змінити свої технічні характеристики або навіть вимкнути службу. Хоча це гарна ідея.
Габріель Еспіноза,

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 = "РЕЗЮМЕ: Назва події"). Якщо ви встановили кешування пристойно довго, це не надто дорога операція.


Натхненний вашим кодом, я переписав його (хоча використовую C #), де синтаксичний аналіз проводиться за блоками, а не символьно. Можна перевірити його на пов'язаний з цим питання: stackoverflow.com/a/27164955/914512
reexmonkey

2

iCal (ical 2.0) і роздруковані тексти не поєднуються.

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

У iCal спеціальні символи представлені за допомогою екранованих екранів, наприклад '\ n'. Кодування за замовчуванням - UTF-8, усі сторони, що відповідають iCal, повинні його підтримувати, і це робить надруковані для друку цитати абсолютно непотрібними в iCal 2.0 (і, в тому числі vCard 3.0).

Можливо, вам доведеться підтримати клієнта / зацікавлену сторону, щоб пояснити вимоги. Здається, існує плутанина між vCal та iCal.


Дякуємо, що підкреслили, що UTF-8 є кодуванням за замовчуванням.
Андреа Антонагелі,


1

Відповідно до 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.

1

Я пропускаю приклад із користувацькими часовими поясами. Отже, ось фрагмент, який показує, як ви можете встановити часовий пояс у 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();

0

iCal може бути складним, тому я рекомендую користуватися бібліотекою. DDay - хороше безкоштовне рішення. Востаннє я перевірив, що він не має повної підтримки повторюваних подій, але, крім цього, виглядає дуже приємно. Обов’язково протестуйте календарі з кількома клієнтами.


0

я знаю, що пізно, але це може допомогти іншим. у моєму випадку я написав наступний текстовий файл із розширенням .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

це спрацювало для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.