我正在寻找一种在C#(asp.net)中生成iCalendar文件(* .ics)的好方法。我找到了一些资源,但是缺少的一件事是它们对带引号的可打印字段(具有回车符和换行符的字段)的支持。
例如,如果描述字段的编码不正确,则仅显示第一行,并可能破坏* .ics文件中的其余信息。
我正在寻找可以生成* .ics文件的现有类和/或可以生成带引号的可打印字段的类。
我正在寻找一种在C#(asp.net)中生成iCalendar文件(* .ics)的好方法。我找到了一些资源,但是缺少的一件事是它们对带引号的可打印字段(具有回车符和换行符的字段)的支持。
例如,如果描述字段的编码不正确,则仅显示第一行,并可能破坏* .ics文件中的其余信息。
我正在寻找可以生成* .ics文件的现有类和/或可以生成带引号的可打印字段的类。
Answers:
我使用DDay.Ical,它的好东西。能够打开一个ical文件并在一个不错的对象模型中获取其数据。它说是beta,但对我们来说效果很好。
该库已被弃用,但已由另一位开发人员选择并重新发布为iCal.NET。
有关发行说明:rianjs.net/2016/07/dday-ical-is-now-ical-net
来源GitHub:github.com/rianjs/ical.net
我发现这样做的最简单方法是使用微格式标记HTML 。
如果您要生成iCalendar文件,则可以使用hCalendar微格式,然后添加诸如“添加到日历”之类的链接,该链接指向:
http://feeds.technorati.com/events/ [您网页的完整URL,包括http://]
然后,Technorati页面解析您的页面,提取hCalendar信息并将iCalendar文件发送给客户端。
我编写了一个匀场函数来处理此问题。它基本上是合规的-唯一的麻烦是第一行是74个字符而不是75个字符(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 feed的摘要和描述。只需在行之前添加字段即可(例如LongText =“ SUMMARY:Event Title”)。只要将缓存设置得足够长,操作就不会太昂贵。
iCal(ical 2.0)和quoted-printable不能同时使用。
vCal(vCal 1.0)中经常使用带引号的可打印字符来表示不可打印的字符,例如换行符(= 0D = 0A)。默认的vCal编码是7位,因此有时您需要使用quoted-printable来表示非ASCII字符(您可以覆盖默认的编码,但是不需要其他与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.
我缺少自定义时区的示例。因此,这里有一个片段,显示了如何在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();
我知道为时已晚,但可能会帮助他人。就我而言,我写了以下扩展名为.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
它为我工作。