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

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

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

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

9 ответов

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

    Редактировать Ноябрь 2016

    Эта библиотека была устаревшей, но была подобрана и повторно выпущена как iCal.NET другим Дэв.

    Примечания о выпуске: rianjs.net/2016/07/dday-ical-is-now-ical-net

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

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

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

    Если вы хотите создать iCalendar файлы, то вы можете использовать микроформат hCalendar, а затем включить ссылку ,такую как «добавить в Календарь», которая указывает на:

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

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

  4. Согласно 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.
    
  5. iCal (ical 2.0) и quoted-printable не идут вместе.

    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.

  6. Я написал функцию оболочки, чтобы справиться с этим. Это в основном совместимо-единственное зависание заключается в том, что первая строка состоит из 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»). Пока вы устанавливаете кэширование достаточно долго, это не слишком дорогая операция.

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

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

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