La creación de Archivos iCal en c#

Estoy buscando un buen método de generación de un archivo iCalendar (*.ics) en c# (asp.net). He encontrado un par de recursos, pero una cosa que ha faltado es su apoyo para quoted-printable campos – campos que tienen retornos de carro y saltos de línea.

Por ejemplo, si el descripción campo no está codificado correctamente, sólo la primera línea de la pantalla y posiblemente dañar el resto de la información en el *.archivo ics.

Estoy buscando clases existentes que pueden generar *.archivos ics y/o de una clase, que puede generar quoted-printable campos.

  • Aunque esta pregunta sucedió hace mucho tiempo, he pensado que me gustaría señalar que » quoted-printable campos no son parte del estándar de iCalendar (vCalendar 2.0). Ellos son parte de la vCalendar estándar (vCalendar 1.0), que es rara vez (si alguna vez) se usa hoy en día. iCalendar tiene su propio método de escapar de datos que es mucho más limpio y más fácil de interpretar que quoted-printable».
InformationsquelleAutor Otto | 2008-08-14

9 Kommentare

  1. 12

    La forma más sencilla que he encontrado de hacerlo es de marcado HTML utilizando los microformatos.

    Si usted está buscando para generar archivos iCalendar, entonces usted podría utilizar el hCalendar microformato, a continuación, incluir un enlace como el ‘Calendario’ que apunta a:

    http://feeds.technorati.com/events/%5B su página de la dirección URL completa incluyendo el http://]

    La Technorati página, a continuación, analiza tu página, extractos de la hCalendar información y envía el archivo iCalendar para el cliente.

    • Este método es utilizado por NerdDinner.com y parece que funciona bastante bien. Dicho esto, tengo que dar +1 para DDay.iCal (aunque yo soy parcial) 🙂
    • Lo que no me gusta de este método es que technorati podría cambiar las especificaciones o incluso apagar el servicio. Es una buena idea, aunque.
  2. 3

    Escribí una placa de apoyo de la función de manejar esto. Es compatible con la mayoría, la única tara es que la primera línea es de 74 caracteres en lugar de 75 (el 74 es controlar el espacio en las 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

    Yo uso este para el resumen y la descripción en nuestra ICS de alimentación. Sólo alimentar la línea con el campo ya se antepone (por ejemplo, LongText = «RESUMEN:Título del Evento»). Como establece el almacenamiento en caché decentemente largo, no es demasiado caro de una operación.

    • Inspirado por su código, reescribí (usando C#, aunque), donde el análisis es por bloques y no de carácter racional. Se puede comprobar que en una pregunta relacionada: stackoverflow.com/a/27164955/914512
  3. 2

    iCal (ical 2.0) y las comillas no van de la mano.

    Quoted-printable » se utiliza mucho en vCal (vCal 1.0) para representar los caracteres no imprimibles, por ejemplo, saltos de línea (=0D=0A). El valor predeterminado vCal de la codificación de 7 bits, por lo que a veces es necesario el uso de comillas para representar caracteres no ASCII (se puede reemplazar la codificación predeterminada, pero el otro vCal compatible con la comunicación de la parte no es necesaria para entenderlo.)

    En iCal, los caracteres especiales se representan mediante escapa, por ejemplo, ‘\n’. El valor predeterminado de la codificación es UTF-8, todos los iCal-conformes las partes deben apoyar y que hace quoted-printable completamente innecesario en iCal 2.0 (y vCard 3.0, para el caso).

    Usted puede necesitar una copia de tus clientes/grupos de partes interesadas para aclarar los requisitos. Parece ser que la confusión entre vCal y iCal.

    • Gracias por destacar que el UTF-8 es la codificación predeterminada.
  4. 1

    Según RFC 2445, la observación y descripción de los campos de TEXTO. Las reglas para una prueba de campo son:
    [1] Una sola línea en un campo de TEXTO que no exceda de 75 octetos.
    [2] la Envoltura se logra mediante la inserción de un CRLF seguido por un espacio en blanco.
    [3] Hay varios personajes que debe ser codificada como \ (barra diagonal inversa) ; (punto y coma) , (coma) y el salto de línea. El uso de un \ (barra diagonal inversa) como delimitador da \ \; \, \n

    Ejemplo: El siguiente es un ejemplo de la propiedad con formato
    los saltos de línea en el valor de la 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.
  5. 0

    iCal puede ser complicado, por lo que recomendamos el uso de una biblioteca. DDay es una buena solución libre. Última vez que lo comprobé no tienen soporte completo para los eventos recurrentes, pero aparte de que se ve realmente bien. Definitivamente la prueba de los calendarios con varios clientes.

  6. 0

    sé que es demasiado tarde, pero puede ayudar a los demás. en mi caso me escribió el siguiente archivo de texto con .ics extensión

    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

    que trabajó para mí.

  7. 0

    Me estoy perdiendo un ejemplo con la costumbre de las zonas de tiempo. Así que aquí un fragmento de código que muestra cómo se puede establecer una zona horaria en el 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();

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea