Tạo tệp iCal trong c #


76

Tôi đang tìm một phương pháp tốt để tạo tệp iCalendar (* .ics) trong c # (asp.net). Tôi đã tìm thấy một vài tài nguyên, nhưng một thứ còn thiếu là sự hỗ trợ của chúng cho các trường có thể in được trích dẫn - các trường có ký tự xuống dòng và nguồn cấp dòng.

Ví dụ: nếu trường mô tả không được mã hóa đúng cách, chỉ dòng đầu tiên sẽ hiển thị và có thể làm hỏng phần còn lại của thông tin trong tệp * .ics.

Tôi đang tìm các lớp hiện có có thể tạo tệp * .ics và / hoặc một lớp có thể tạo các trường có thể in được trích dẫn .


8
Mặc dù câu hỏi này đã xảy ra cách đây khá lâu, nhưng tôi nghĩ rằng tôi đã chỉ ra rằng các trường có thể in được trích dẫn không phải là một phần của tiêu chuẩn iCalendar (vCalendar 2.0). Chúng là một phần của tiêu chuẩn vCalendar (vCalendar 1.0) mà ngày nay hiếm khi (nếu đã từng) được sử dụng. iCalendar có phương pháp thoát dữ liệu riêng, sạch hơn và dễ hiểu hơn rất nhiều so với có thể in được trích dẫn.
Doug

Câu trả lời:


73

Tôi sử dụng DDay.Ical , thứ tốt của nó. Có khả năng mở tệp ical và lấy dữ liệu của nó trong một mô hình đối tượng đẹp. Nó nói là beta, nhưng nó hoạt động tốt cho chúng tôi.

Chỉnh sửa tháng 11 năm 2016

Thư viện này đã không còn được dùng nữa, nhưng đã được một nhà phát triển khác chọn và phát hành lại dưới dạng iCal.NET.

Ghi chú về việc phát hành: rianjs.net/2016/07/dday-ical-is-now-ical-net

Nguồn trên GitHub: github.com/rianjs/ical.net


12

Cách dễ nhất mà tôi đã tìm thấy để làm điều này là đánh dấu HTML của bạn bằng vi định dạng .

Nếu bạn đang tìm cách tạo tệp iCalendar thì bạn có thể sử dụng vi định dạng hCalendar sau đó bao gồm một liên kết như 'Thêm vào Lịch' trỏ đến:

http://feeds.technorati.com/events/ [ URL đầy đủ trên trang của bạn bao gồm cả http: //]

Sau đó, trang Technorati sẽ phân tích cú pháp trang của bạn, trích xuất thông tin hCalendar và gửi tệp iCalendar tới ứng dụng khách.


3
Phương pháp này được sử dụng bởi NerdDinner.com và có vẻ hoạt động khá hiệu quả. Điều đó nói rằng, tôi đã có để cung cấp cho 1 cho DDay.iCal (mặc dù tôi đang thiên vị) :)
Doug

Điều tôi không thích ở phương pháp này là công nghệ có thể thay đổi thông số kỹ thuật của nó hoặc thậm chí tắt dịch vụ. Đó là một ý kiến ​​hay.
Gabriel Espinoza

3

Tôi đã viết một hàm shim để xử lý điều này. Nó hầu hết đều tuân thủ - lỗi duy nhất là dòng đầu tiên có 74 ký tự thay vì 75 (74 là để xử lý khoảng trống trên các dòng tiếp theo) ...

 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

Tôi sử dụng điều này cho phần tóm tắt và mô tả trên nguồn cấp dữ liệu ICS của chúng tôi. Chỉ cần nạp dòng với trường đã được thêm trước (ví dụ: LongText = "SUMMARY: Event Title"). Miễn là bạn đặt bộ nhớ đệm lâu dài, nó không quá tốn kém cho một hoạt động.


Lấy cảm hứng từ mã của bạn, tôi đã viết lại nó (mặc dù sử dụng C #) trong đó phân tích cú pháp là theo khối chứ không phải theo ký tự. Có thể kiểm tra nó tại một câu hỏi liên quan: stackoverflow.com/a/27164955/914512
reexmonkey

2

iCal (ical 2.0) và có thể in được trích dẫn không đi cùng nhau.

Có thể in được trích dẫn được sử dụng nhiều trong vCal (vCal 1.0) để biểu thị các ký tự không in được, ví dụ: ngắt dòng (= 0D = 0A). Mã hóa vCal mặc định là 7 bit, vì vậy đôi khi bạn cần sử dụng có thể in được trích dẫn để biểu thị các ký tự không phải ASCII (bạn có thể ghi đè mã hóa mặc định, nhưng bên giao tiếp tuân thủ vCal khác không bắt buộc phải hiểu nó).

Trong iCal , các ký tự đặc biệt được biểu diễn bằng cách sử dụng các thoát, ví dụ: '\ n'. Mã hóa mặc định là UTF-8, tất cả các bên tuân thủ iCal phải hỗ trợ mã hóa đó và điều đó làm cho việc in trích dẫn hoàn toàn không cần thiết trong iCal 2.0 (và vCard 3.0, cho vấn đề đó).

Bạn có thể cần hỗ trợ khách hàng / bên liên quan của mình để làm rõ các yêu cầu. Dường như có sự nhầm lẫn giữa vCal và iCal.


Cảm ơn bạn đã đánh dấu rằng UTF-8 là mã hóa mặc định.
Andrea Antonangeli


1

Theo RFC-2445, các trường nhận xét và mô tả là TEXT. Các quy tắc cho trường kiểm tra là: [1] Một dòng đơn trong trường TEXT không được vượt quá 75 octet. [2] Việc đóng gói đạt được bằng cách chèn một CRLF theo sau là khoảng trắng. [3] Có một số ký tự phải được mã hóa bao gồm \ (dấu gạch chéo ngược); (dấu chấm phẩy), (dấu phẩy) và dòng mới. Sử dụng \ (dấu gạch chéo ngược) làm dấu phân cách cho \ \; \, \ n

Ví dụ: Sau đây là ví dụ về thuộc tính với các dấu ngắt dòng được định dạng trong giá trị thuộc tính:

 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.

1

Tôi thiếu một ví dụ về múi giờ tùy chỉnh. Vì vậy, đây là một đoạn mã cho thấy cách bạn có thể đặt múi giờ trong ics (và gửi nó đến trình duyệt trong 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();

0

iCal có thể phức tạp, vì vậy tôi khuyên bạn nên sử dụng thư viện. DDay là một giải pháp miễn phí tốt. Lần cuối tôi kiểm tra nó không có hỗ trợ đầy đủ cho các sự kiện lặp lại, nhưng ngoài việc nó trông thực sự đẹp. Chắc chắn sẽ kiểm tra lịch với một số khách hàng.


0

tôi biết là quá muộn, nhưng nó có thể giúp ích cho những người khác. trong trường hợp của tôi, tôi đã viết tệp văn bản sau với phần mở rộng .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

nó đã làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.