#c# #.net #icalendar
#c# #.net #icalendar
Вопрос:
Файл Ics не загружается браузером, который я использовал iCal.NET для генерации файла ics и кода все в порядке, но файл ics не загружается. Как я могу загрузить его в виде вложения? Я имею в виду, как сделать файл .ics загружаемым, чтобы я мог загрузить его на свой диск, а затем открыть его в Outlook, чтобы добавить в календарь.
Мой код:
var calendar = new Ical.Net.Calendar();
calendar.Events.Add(new Event
{
Class = "PUBLIC",
Summary = Summary,
Created = new CalDateTime(DateTime.Now),
Description = title,
Start = new CalDateTime(Convert.ToDateTime(EventStart)),
End = new CalDateTime(Convert.ToDateTime(EventEnd)),
Sequence = 0,
Uid = Guid.NewGuid().ToString(),
Location = Location,
});
var serializer = new CalendarSerializer(new SerializationContext());
var serializedCalendar = serializer.SerializeToString(calendar);
var bytesCalendar = Encoding.UTF8.GetBytes(serializedCalendar);
return File(bytesCalendar, "text/calendar", "event.ics");
В ответе браузера я получаю следующее, которое является правильным:
BEGIN:VCALENDAR
PRODID:-//github.com/rianjs/ical.net//NONSGML ical.net 2.2//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20190403T191521
DESCRIPTION:Inspection of property: 6 Dight Avenue Balwyn North 3104
DTEND:20190413T110000
DTSTAMP:20190403T111521Z
DTSTART:20190413T103000
LOCATION:-37.797534, 145.079921
SEQUENCE:0
SUMMARY:Inspection of property: 6 Dight Avenue Balwyn North 3104
UID:d977d4c7-2a0d-453e-940f-d7313e35b197
END:VEVENT
END:VCALENDAR
Комментарии:
1. Пожалуйста, объясните, что вы подразумеваете под «не загружается браузером». Что происходит? У вас есть какие-либо сообщения об ошибках? Поскольку неясно, что на самом деле происходит не так, пожалуйста, найдите время, чтобы дополнить свой вопрос дополнительной информацией, тогда, я уверен, вы получите более полезный ответ.
2. Я согласен, что, похоже, он должен что-то делать; итак: что на самом деле происходит? например, если вы запустите «Fiddler» — каков фактический http-ответ здесь? Правильно ли выглядят заголовки и содержимое? т.Е. имеет ли он указанный вами тип содержимого и расположение? и является ли тело ответа данными ics?
3. Пожалуйста, покажите HTTP-заголовки ответа. Вы можете просмотреть их в инструментах разработчика браузера.
4. Вот ответ заголовка: HTTP/ 1.1 200 OK Cache-Control: private Content-Длина содержимого: 485 Тип содержимого: текст / календарь; кодировка= utf-8 Расположение содержимого: вложение; имя файла=CalendarItem_6 Dight Avenue Balwyn North 3104.ics.ics X-ИСХОДНЫЕ файлы: =?UTF-8?B?QzpcVXNlcnNcQXN1c1xEZXNrdG9wXEF1c3RyYWxpYV9Tb3VyY2VcQXVzdHJhbGlhXFBQUS5XZWJcU2VhcmNoXENyZWF0ZUlDU0ZpbGVc?=
Ответ №1:
Вот мое решение, которое сработало для меня:
StringBuilder sb = new StringBuilder();
//start the calendar item
sb.AppendLine("BEGIN:VCALENDAR");
sb.AppendLine("VERSION:2.0");
sb.AppendLine("PRODID:propertyqueen.com");
sb.AppendLine("CALSCALE:GREGORIAN");
sb.AppendLine("METHOD:PUBLISH");
//create a time zone if needed, TZID to be used in the event itself
sb.AppendLine("BEGIN:VTIMEZONE");
sb.AppendLine("BEGIN:STANDARD");
sb.AppendLine("TZID:Australia/Sydney");
sb.AppendLine("TZOFFSETTO: 1000");
sb.AppendLine("TZOFFSETFROM: 1000");
sb.AppendLine("END:STANDARD");
sb.AppendLine("END:VTIMEZONE");
//add the event
sb.AppendLine("BEGIN:VEVENT");
//without timezones
sb.AppendLine("DTSTART:" EventStartDateTime.ToString("yyyyMMddTHHmm00"));
sb.AppendLine("DTEND:" EventEndDateTime.ToString("yyyyMMddTHHmm00"));
sb.AppendLine("SUMMARY:" Summary "");
sb.AppendLine("LOCATION:" Location "");
sb.AppendLine("DESCRIPTION:" Description "");
sb.AppendLine("PRIORITY:3");
sb.AppendLine("END:VEVENT");
sb.AppendLine("END:VCALENDAR");
//send the calendar item to the browser
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/calendar";
Response.AddHeader("content-length", sb.Length.ToString());
Response.AddHeader("content-disposition", "attachment;filename=" FileName);
Response.Write(sb.ToString());
Response.Flush();
Response.End();
var bytes = Encoding.UTF8.GetBytes(sb.ToString());
return File(bytes, "text/calendar", FileName);