Erstellen von iCal-Dateien in c #

76

Ich suche nach einer guten Methode zum Generieren einer iCalendar-Datei (* .ics) in c # (asp.net). Ich habe ein paar Ressourcen gefunden, aber eine Sache, die gefehlt hat, ist die Unterstützung für druckbare Felder in Anführungszeichen - Felder mit Wagenrücklauf und Zeilenvorschub.

Wenn das Beschreibungsfeld beispielsweise nicht richtig codiert ist, wird nur die erste Zeile angezeigt und möglicherweise die restlichen Informationen in der * .ics-Datei beschädigt.

Ich suche nach vorhandenen Klassen, die * .ics-Dateien generieren können, und / oder nach einer Klasse, die in Anführungszeichen druckbare Felder generieren kann .

Otto
quelle
8
Obwohl diese Frage vor langer Zeit gestellt wurde, dachte ich, ich möchte darauf hinweisen, dass in Anführungszeichen druckbare Felder nicht Teil des iCalendar-Standards (vCalendar 2.0) sind. Sie sind Teil des vCalendar-Standards (vCalendar 1.0), der heutzutage selten (wenn überhaupt) verwendet wird. iCalendar verfügt über eine eigene Methode zum Entkommen von Daten, die viel sauberer und einfacher zu interpretieren ist als das Drucken in Anführungszeichen.
Doug

Antworten:

73

Ich benutze DDay.Ical , es ist gutes Zeug. Hat die Fähigkeit, eine ical-Datei zu öffnen und ihre Daten in einem schönen Objektmodell abzurufen. Es heißt Beta, aber es funktioniert gut für uns.

Bearbeiten Nov 2016

Diese Bibliothek ist veraltet, wurde jedoch von einem anderen Entwickler als iCal.NET aufgenommen und erneut veröffentlicht.

Hinweise zur Veröffentlichung: rianjs.net/2016/07/dday-ical-is-now-ical-net

Quelle auf GitHub: github.com/rianjs/ical.net

Entwicklung von Chris
quelle
12

Der einfachste Weg, dies zu tun, besteht darin, Ihr HTML mit Mikroformaten zu markieren .

Wenn Sie iCalendar-Dateien generieren möchten, können Sie das hCalendar-Mikroformat verwenden und dann einen Link wie "Zum Kalender hinzufügen" einfügen, der auf Folgendes verweist:

http://feeds.technorati.com/events/ [ die vollständige URL Ihrer Seite einschließlich http: //]

Die Technorati-Seite analysiert dann Ihre Seite, extrahiert die hCalendar-Informationen und sendet die iCalendar-Datei an den Client.

Ian Oxley
quelle
3
Diese Methode wird von NerdDinner.com verwendet und scheint recht gut zu funktionieren. Das heißt, ich muss +1 für DDay.iCal geben (obwohl ich voreingenommen bin ) :)
Doug
Was mir an dieser Methode nicht gefällt, ist, dass Technorati ihre Spezifikationen ändern oder sogar den Dienst herunterfahren kann. Es ist jedoch eine gute Idee.
Gabriel Espinoza
3

Ich habe eine Shim-Funktion geschrieben, um damit umzugehen. Es ist größtenteils konform - das einzige Problem ist, dass die erste Zeile 74 statt 75 Zeichen enthält (die 74 soll das Leerzeichen in den nachfolgenden Zeilen behandeln) ...

 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

Ich verwende dies für die Zusammenfassung und Beschreibung in unserem ICS-Feed. Geben Sie einfach die Zeile mit dem bereits vorangestellten Feld ein (z. B. LongText = "SUMMARY: Event Title"). Solange Sie das Caching anständig lang einstellen, ist eine Operation nicht zu teuer.

atmarx
quelle
Inspiriert von Ihrem Code habe ich ihn neu geschrieben (allerdings mit C #), wobei die Analyse blockweise und nicht zeichenweise erfolgt. Kann es bei einer verwandten Frage überprüfen: stackoverflow.com/a/27164955/914512
reexmonkey
2

iCal (ical 2.0) und Quoted-Printable passen nicht zusammen.

Quoted- printable wird in vCal (vCal 1.0) häufig verwendet, um nicht druckbare Zeichen darzustellen, z. B. Zeilenumbrüche (= 0D = 0A). Die Standard-vCal-Codierung ist 7-Bit, daher müssen Sie manchmal Anführungszeichen verwenden, um Nicht-ASCII-Zeichen darzustellen (Sie können die Standardcodierung überschreiben, aber die andere vCal-kompatible kommunizierende Partei muss sie nicht verstehen.)

In iCal werden Sonderzeichen durch Escapezeichen dargestellt, z. B. '\ n'. Die Standardcodierung ist UTF-8, alle iCal-kompatiblen Parteien müssen sie unterstützen, und das macht das Drucken in Anführungszeichen in iCal 2.0 (und vCard 3.0) völlig unnötig.

Möglicherweise müssen Sie Ihren Kunden / Stakeholder unterstützen, um die Anforderungen zu klären. Es scheint Verwirrung zwischen vCal und iCal zu geben.

Azheglov
quelle
Vielen Dank, dass Sie hervorgehoben haben, dass UTF-8 die Standardcodierung ist.
Andrea Antonangeli
1

Gemäß RFC-2445 sind die Kommentar- und Beschreibungsfelder TEXT. Die Regeln für ein Testfeld lauten: [1] Eine einzelne Zeile in einem TEXT-Feld darf 75 Oktette nicht überschreiten. [2] Das Umschließen erfolgt durch Einfügen einer CRLF gefolgt von einem Leerzeichen. [3] Es gibt mehrere Zeichen, die codiert werden müssen, einschließlich \ (umgekehrter Schrägstrich); (Semikolon), (Komma) und Zeilenumbruch. Die Verwendung eines \ (umgekehrter Schrägstrich) als Trennzeichen ergibt \ \; \, \ n

Beispiel: Das folgende Beispiel zeigt die Eigenschaft mit formatierten Zeilenumbrüchen im Eigenschaftswert:

 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.

quelle
1

Mir fehlt ein Beispiel mit benutzerdefinierten Zeitzonen. Hier also ein Ausschnitt, der zeigt, wie Sie eine Zeitzone im ics festlegen (und an den Browser in asp.net senden können).

//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();
VDWWD
quelle
0

iCal kann kompliziert sein, daher empfehle ich die Verwendung einer Bibliothek. DDay ist eine gute kostenlose Lösung. Zuletzt habe ich überprüft, dass es keine vollständige Unterstützung für wiederkehrende Ereignisse gibt, aber ansonsten sieht es wirklich gut aus. Testen Sie die Kalender auf jeden Fall mit mehreren Kunden.

Lance Fisher
quelle
0

Ich weiß, dass es zu spät ist, aber es kann anderen helfen. In meinem Fall habe ich folgende Textdatei mit der Erweiterung .ics geschrieben

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

es hat bei mir funktioniert.

Manpreet Singh Dhillon
quelle