developer tip

C #에서 iCal 파일 만들기

optionbox 2020. 10. 22. 07:56
반응형

C #에서 iCal 파일 만들기


c # (asp.net)에서 iCalendar 파일 (* .ics)을 생성하는 좋은 방법을 찾고 있습니다. 몇 가지 리소스를 찾았지만 한 가지 부족한 것은 캐리지 리턴 및 줄 바꿈이있는 필드 인 인용 인쇄 가능한 필드에 대한 지원입니다 .

예를 들어 설명 필드가 제대로 인코딩되지 않은 경우 첫 번째 줄만 표시되고 * .ics 파일의 나머지 정보가 손상 될 수 있습니다.

* .ics 파일을 생성 할 수있는 기존 클래스 및 / 또는 인용 인쇄 가능한 필드를 생성 할 수있는 클래스를 찾고 있습니다.


나는 DDay.Ical을 사용 합니다. ical 파일을 열고 멋진 개체 모델에서 데이터를 가져올 수 있습니다. 베타라고 말하지만 우리에게는 잘 작동합니다.

2016 년 11 월 수정

이 라이브러리는 더 이상 사용되지 않지만 다른 개발자가 iCal.NET으로 선택하여 다시 릴리스했습니다.

릴리스에 대한 참고 사항 : rianjs.net/2016/07/dday-ical-is-now-ical-net

GitHub의 출처 : github.com/rianjs/ical.net


내가 찾은 가장 쉬운 방법은 microformats를 사용하여 HTML을 마크 업하는 것 입니다.

iCalendar 파일을 생성하려는 경우 hCalendar 마이크로 포맷사용하고 다음을 가리키는 '캘린더에 추가'와 같은 링크를 포함 할 수 있습니다 .

http://feeds.technorati.com/events/ [ http : //를 포함한 페이지의 전체 URL]

그런 다음 Technorati 페이지는 페이지를 구문 분석하고 hCalendar 정보를 추출하고 iCalendar 파일을 클라이언트에 보냅니다.


이것을 처리하기 위해 shim 함수를 작성했습니다. 대부분 호환됩니다. 첫 번째 줄이 75 자 대신 74 자 (74는 다음 줄의 공백을 처리하는 것임)라는 것뿐입니다.

 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

ICS 피드의 요약 및 설명에 사용합니다. 필드가 이미 추가 된 줄을 입력하십시오 (예 : LongText = "SUMMARY : Event Title"). 캐싱을 적당히 오래 설정하는 한 작업 비용이 너무 많이 들지 않습니다.


iCal (ical 2.0)과 인용 인쇄용은 함께 사용할 수 없습니다.

인용 인쇄 가능은 vCal (vCal 1.0)에서 인쇄 할 수없는 문자를 나타 내기 위해 많이 사용됩니다 (예 : 줄 바꿈 (= 0D = 0A)). 기본 vCal 인코딩은 7 비트이므로 때때로 비 ASCII 문자를 나타 내기 위해 quoted-printable을 사용해야합니다 (기본 인코딩을 재정의 할 수 있지만 다른 vCal 호환 통신 당사자는이를 이해할 필요가 없습니다).

에서 iCal을 , 특수 문자 예를 들어, '\ n'을, 탈출을 사용하여 표시됩니다. 기본 인코딩은 UTF-8이며 모든 iCal 호환 당사자는이를 지원해야하며 iCal 2.0 (및 vCard 3.0)에서는 인용 인쇄가 완전히 필요하지 않습니다.

요구 사항을 명확히하기 위해 고객 / 이해 관계자를 지원해야 할 수도 있습니다. vCal과 iCal 사이에 혼동이있는 것 같습니다.


http://www.codeproject.com/KB/vb/vcalendar.aspx 확인

요청한대로 따옴표로 묶인 인쇄 가능한 필드를 처리하지 않지만 나머지 코드는 거기에 있으며 수정할 수 있습니다.


RFC-2445에 따르면 주석 및 설명 필드는 TEXT입니다. 테스트 필드에 대한 규칙은 다음과 같습니다. [1] TEXT 필드의 한 줄은 75 옥텟을 초과하지 않아야합니다. [2] 래핑은 CRLF 다음에 공백을 삽입하여 수행됩니다. [3] \ (역 슬래시)를 포함하여 인코딩해야하는 여러 문자가 있습니다. (세미콜론), (쉼표) 및 줄 바꿈. \ (역 슬래시)를 구분 기호로 사용하면 \ \가됩니다. \, \ n

예 : 다음은 속성 값에 서식이 지정된 줄 바꿈이있는 속성의 예입니다.

 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.

iCal은 복잡 할 수 있으므로 라이브러리 사용을 권장합니다. DDay는 좋은 무료 솔루션입니다. 마지막으로 반복되는 이벤트를 완벽하게 지원하지 않는지 확인했지만 그 외에는 정말 멋져 보입니다. 여러 클라이언트로 캘린더를 확실히 테스트합니다.


너무 늦었지만 다른 사람들에게 도움이 될 수 있습니다. 제 경우에는 확장자가 .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

그것은 나를 위해 일했습니다.


사용자 지정 시간대가있는 예가 없습니다. 여기에 ics에서 시간대를 설정하고 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();

참고 URL : https://stackoverflow.com/questions/10658/creating-ical-files-in-c-sharp

반응형