Crearea fișierelor iCal în c #

Caut o metodă bună de generare a unui fișier iCalendar (* .ics) în C# (asp.net). Am găsit câteva resurse, dar un singur lucru a fost lipsit de sprijinul lor pentru câmpurile citate-tipărite - câmpurile care au returnări de cărucioare și fluxuri de linii.

De exemplu, dacă câmpul descriere nu este corect codificat, numai prima linie va afișa și eventual va corupe restul informațiilor din fișierul * .ics.

Căut pentru clase existente care pot genera fișiere * .ics și/sau o clasă care poate genera câmpuri citate-tipărite .

0
fr hi bn
Chiar dacă această întrebare sa întâmplat cu mult timp în urmă, m-am gândit să subliniez faptul că acele câmpuri tipărite sunt nu parte a standardului iCalendar (vCalendar 2.0). Acestea fac parte din standardul vCalendar (vCalendar 1.0), care este rar (dacă vreodată) folosit în zilele noastre. iCalendar are o metodă proprie de scăpare a datelor care este mult mai curată și mai ușor de interpretat decât citată-imprimabilă.
adăugat autor Doug, sursa

8 răspunsuri

Eu folosesc DDay.Ical , lucrurile bune. Are abilitatea de a deschide un fișier ical și de a obține datele sale într-un model de obiect frumos. Se spune beta, dar funcționează minunat pentru noi.

Editați noiembrie 2016

Această bibliotecă a fost depreciată, dar a fost preluată și re-lansată ca iCal.NET de un alt dev.

Notes about the release: rianjs.net/2016/07/dday-ical-is-now-ical-net

Source on GitHub: github.com/rianjs/ical.net

0
adăugat
mulțumesc, actualizat
adăugat autor DevelopingChris, sursa
Tocmai am folosit acest răspuns, și se pare că funcționează excelent! Voi incerca sa scriu un blog despre acest lucru si sa il post pe aici daca as face.
adăugat autor John Bubriski, sursa
Păcat că DDay.Ical nu este puternic semnat, deci nu poate fi menționat de ansambluri semnate puternic :(
adăugat autor Janis Veinbergs, sursa
Această bibliotecă a fost depreciată, dar a fost preluată și re-lansată de un alt dev: rianjs.net/2016/07/dday-ical-is-now-ical-net | github.com/rianjs/ical.net
adăugat autor jocull, sursa
@janis sursa este disponibilă pentru descărcare, puteți să o primiți și să o semnați singur.
adăugat autor John Boker, sursa
Legătura de mai sus este ruptă. Aici este linkul SourceForge: sourceforge.net/projects/dday-ical
adăugat autor Martin Buberl, sursa
aceasta este încă cea mai bună opțiune disponibilă în 2015?
adăugat autor Dizzle, sursa

iCal poate fi complicat, așadar vă recomand să folosiți o bibliotecă. DDay este o soluție bună. Ultima am verificat că nu are suport complet pentru evenimente recurente, dar altfel decât arată foarte frumos. Testați cu certitudine calendarele cu mai mulți clienți.

0
adăugat

Check out http://www.codeproject.com/KB/vb/vcalendar.aspx

Nu se ocupă cu câmpurile tipărite așa cum ați cerut, dar restul codului există și pot fi modificate.

0
adăugat

Imi lipseste un exemplu cu zonele de timp personalizate. Deci, aici un fragment care arată modul în care puteți seta o fus orar în ics (și trimiteți-l browser-ului în 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
adăugat

Cea mai ușoară modalitate pe care am descoperit-o este de a marca codul HTML utilizând microformate .

Dacă doriți să generați fișiere iCalendar, puteți utiliza microformatul hCalendar , apoi includeți un link precum " Adăugați la Calendar 'care indică spre:

http://feeds.technorati.com/events/[ your page's full URL including the http:// ]

Pagina Technorati analizează apoi pagina dvs., extrage informațiile hCalendar și trimite fișierul iCalendar clientului.

0
adăugat
Această metodă este folosită de NerdDinner.com și pare să funcționeze destul de bine. Acestea fiind spuse, trebuie sa dau +1 pentru DDay.iCal (desi eu <<> am ) :)
adăugat autor Doug, sursa
Ceea ce nu-mi place de această metodă este că technorati ar putea schimba specificațiile sale sau chiar opri serviciul. Este o idee bună, totuși.
adăugat autor Gabriel Espinoza, sursa

iCal (ical 2.0) and quoted-printable don't go together.

Citat-tipărit este folosit foarte mult în vCal (vCal 1.0) pentru a reprezenta caractere care nu se pot imprima, de ex. întreruperi de linie (= 0D = 0A). Codificarea prestabilită vCal este de 7 biți, deci uneori trebuie să utilizați tipărire cotată pentru a reprezenta caractere non-ASCII (puteți suprascrie codificarea implicită, dar celelalte părți care comunică conform vCal nu trebuie să o înțeleagă).

În iCal , caracterele speciale sunt reprezentate utilizând escapes, de ex. '\ N'. Codificarea implicită este UTF-8, toate părțile compatibile cu iCal trebuie să o susțină și acest lucru face ca imprimarea citată să fie complet inutilă în iCal 2.0 (și vCard 3.0, de pildă).

Este posibil să aveți nevoie să vă întoarceți clientul/părțile interesate pentru a clarifica cerințele. Se pare că există vreo confuzie între vCal și iCal.

0
adăugat
Vă mulțumim pentru evidențierea faptului că UTF-8 este codificarea implicită.
adăugat autor Andrea Antonangeli, sursa

Am scris o funcție pentru a rezolva asta. Este în cea mai mare parte compatibilă - numai hangup este că prima linie este de 74 de caractere în loc de 75 (74 este de a manipula spațiul pe liniile ulterioare) ...

 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

Folosesc acest lucru pentru rezumatul și descrierea feed-ului nostru ICS. Doar hrăniți linia cu câmpul deja prefixat (de ex. LongText = "REZUMAT: Titlul evenimentului"). Atâta timp cât setați cache-ul în mod decent, nu este prea scump pentru o operație.

0
adăugat
Inspirat de codul dvs., l-am rescris (folosind C# deși) în cazul în care parsarea este de blocuri și nu de caractere. Poți verifica la o întrebare conexă: stackoverflow.com/a/27164955/914512
adăugat autor reexmonkey, sursa

Știu că este prea târziu, dar poate ajuta și pe alții. în cazul meu am scris următorul fișier text cu extensia .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

a lucrat pentru mine.

0
adăugat