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 .
Antworten:
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
quelle
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.
quelle
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.
quelle
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.
quelle
Überprüfen Sie http://www.codeproject.com/KB/vb/vcalendar.aspx
Die von Ihnen angeforderten druckbaren Felder werden nicht wie gewünscht behandelt, aber der Rest des Codes ist vorhanden und kann geändert werden.
quelle
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
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();
quelle
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.
quelle
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.
quelle