2008-08-14 75 views
73

Estoy buscando un buen método para generar un archivo iCalendar (* .ics) en C# (asp.net). He encontrado un par de recursos, pero una cosa que ha faltado es su compatibilidad con los campos cotizados e imprimibles - campos que tienen devoluciones de carro y alimentaciones de línea.Creando archivos iCal en C#

Por ejemplo, si el campo descripción no está codificado correctamente, solo se mostrará la primera línea y posiblemente se corromperá el resto de la información en el archivo * .ics.

Estoy buscando clases existentes que puedan generar archivos * .ics y/o una clase que pueda generar entre comillas imprimibles campos.

+8

Aunque esta pregunta sucedió hace mucho tiempo, pensé que señalaría que los campos imprimibles con comillas * no * son parte del estándar iCalendar (vCalendar 2.0). Son parte del estándar vCalendar (vCalendar 1.0) que rara vez (o nunca) se usa hoy en día. iCalendar tiene su propio método de escaparse de datos que es mucho más limpio y fácil de interpretar que el de impresión entre comillas. – Doug

Respuesta

70

Yo uso DDay.Ical, son buenas cosas. Tiene la capacidad de abrir un archivo ical y obtener sus datos en un modelo de objeto agradable. Dice beta, pero funciona muy bien para nosotros.

Editar Nov 2016

Esta biblioteca está en desuso, pero fue recogido y re-lanzado como iCal.NET por otro prog.

Notas sobre la liberación: rianjs.net/2016/07/dday-ical-is-now-ical-net

Fuente en GitHub: github.com/rianjs/ical.net

+2

El enlace de arriba está roto. Aquí está el enlace de SourceForge: http://sourceforge.net/projects/dday-ical/ –

+0

gracias, actualizado – DevelopingChris

+0

Lástima que DDay.Ical no esté fuertemente firmado por lo que no puede ser referenciado por ensambles fuertemente firmados :( –

0

iCal puede ser complicado, por lo que recomendamos el uso de una biblioteca. DDay es una buena solución gratuita. La última vez que lo revisé no tenía soporte completo para los eventos recurrentes, pero aparte de eso, se ve realmente bien. Definitivamente prueba los calendarios con varios clientes.

12

La manera más fácil que he encontrado de hacer esto es marcar tu HTML usando microformats.

Si usted está mirando para generar archivos de iCalendar entonces se podría utilizar el hCalendar microformat continuación, incluir un enlace como 'Agregar al calendario' que apunta a:

http://feeds.technorati.com/events/[ de su página URL completa incluyendo http: // ]

La página de Technorati luego analiza su página, extrae la información de hCalendar y envía el archivo de iCalendar al cliente.

+3

Este método es utilizado por NerdDinner.com y parece funcionar muy bien. Dicho esto, tengo que dar +1 a DDay.iCal (aunque * soy * parcial) :) – Doug

+0

Wha Lo que no me gusta de este método es que Technorati podría cambiar sus especificaciones o incluso cerrar el servicio. Aunque es una buena idea. –

1

Según RFC-2445, los campos de comentario y descripción son TEXTO. Las reglas para un campo de prueba son: [1] Una sola línea en un campo de TEXTO no debe exceder 75 octetos. [2] El ajuste se logra insertando un CRLF seguido de un espacio en blanco. [3] Hay varios caracteres que deben codificarse incluyendo \ (barra invertida); (punto y coma), (coma) y nueva línea. El uso de un \ (barra diagonal inversa) como un delimitador da \ \; \, \ N

Ejemplo: El siguiente es un ejemplo de la propiedad con formateados saltos de línea en el valor de propiedad:

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. 
2

iCal (iCal 2.0) y entre comillas imprimibles no van juntas.

Quoted-printable se usa mucho en vCal (vCal 1.0) para representar caracteres no imprimibles, p. saltos de línea (= 0D = 0A). La codificación vCal predeterminada es de 7 bits, por lo que a veces es necesario utilizar cotizado e imprimible para representar caracteres que no sean ASCII (puede anular la codificación predeterminada, pero la otra parte comunicante que cumple con vCal no está obligada a entenderla)

En iCal, los caracteres especiales se representan utilizando escapes, por ejemplo '\norte'. La codificación predeterminada es UTF-8, todas las partes que cumplen con iCal deben admitirlo y eso hace que la impresión con comillas sea completamente innecesaria en iCal 2.0 (y vCard 3.0, para el caso).

Es posible que necesite respaldar a su cliente/parte interesada para aclarar los requisitos. Parece haber confusión entre vCal e iCal.

+0

Gracias por destacar que UTF-8 es la codificación predeterminada. –

3

Escribí una función shim para manejar esto. Es más que nada sea compatible con - el único hangup es que la primera línea es de 74 caracteres en lugar de 75 (el 74 es para manejar el espacio en líneas posteriores) ...

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 

lo uso para el resumen y la descripción en nuestra alimentación ICS. Simplemente ingrese la línea con el campo ya agregado (por ejemplo, LongText = "RESUMEN: Título del evento"). Siempre que configure el almacenamiento en caché decentemente largo, no es demasiado costoso para una operación.

+0

Inspirado por tu código, lo reescribí (usando C#) donde el análisis es por bloques y no por carácter. Puede verificarlo en una pregunta relacionada: http://stackoverflow.com/a/27164955/914512 – reexmonkey

0

sé que es demasiado tarde, pero puede ayudar a otros. en mi caso, escribí el siguiente archivo de texto con extensión .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 

funcionó para mí.

0

Me falta un ejemplo con zonas horarias personalizadas. Aquí hay un fragmento que muestra cómo se puede establecer un huso horario en los ics (y enviarlo al navegador en 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();