FileResult with MemoryStream gives empty result ..

2020-06-30 08:59发布

I'm generating ics files ( iCalendar or RFC 2445 or however you call them) using a library that serializes the ical contents into a MemoryStream, or actually any type of stream.

Here's my chunk of code:

    public ActionResult iCal(int id) {

        MyApp.Event kiEvt = evR.Get(id);

        // Create a new iCalendar
        iCalendar iCal = new iCalendar();

        // Create the event, and add it to the iCalendar
        DDay.iCal.Components.Event evt = iCal.Create<DDay.iCal.Components.Event>();

        // Set information about the event
        evt.Start = kiEvt.event_date;
        evt.End = evt.Start.AddHours(kiEvt.event_duration); // This also sets the duration            
        evt.Description = kiEvt.description;
        evt.Location = kiEvt.place;
        evt.Summary = kiEvt.title;

        // Serialize (save) the iCalendar
        iCalendarSerializer serializer = new iCalendarSerializer(iCal);


        System.IO.MemoryStream fs = new System.IO.MemoryStream();

        serializer.Serialize(fs, System.Text.Encoding.UTF8);

        return File(fs, "text/calendar", "MyApp.wyd."+kiEvt.id+".ics");
    }

My problem is that fs contains some content, but the controller returns empty file - with proper mimetype and filename. I'm most probably missing something with the stream handling but can't figure out what.

Can anybody help me out here? Thanks in advance.

2条回答
Luminary・发光体
2楼-- · 2020-06-30 09:27
iCalendar iCal = new iCalendar();
foreach (CalendarItem item in _db.CalendarItems.Where(r => r.Start > DateTime.Now && r.Active == true && r.CalendarID == ID).ToList())
{
    Event evt = new Event();
    evt.Start = new iCalDateTime(item.Start);
    evt.End = new iCalDateTime(item.End);
    evt.Summary = "Some title";
    evt.IsAllDay = false;
    evt.Duration = (item.End - item.Start).Duration();
    iCal.Events.Add(evt);
}
// Create a serialization context and serializer factory. 
// These will be used to build the serializer for our object. 
ISerializationContext ctx = new SerializationContext();
ISerializerFactory factory = new DDay.iCal.Serialization.iCalendar.SerializerFactory();
// Get a serializer for our object
IStringSerializer serializer = factory.Build(iCal.GetType(), ctx) as IStringSerializer;
if (serializer == null) return Content("");
string output = serializer.SerializeToString(iCal);
var contentType = "text/calendar";
var bytes = Encoding.UTF8.GetBytes(output);
var result = new FileContentResult(bytes, contentType);
result.FileDownloadName = "FileName.ics";
return result;
查看更多
家丑人穷心不美
3楼-- · 2020-06-30 09:36

Just a guess: Do you need to Seek back to the start of the stream before you return it?

fs.Seek(0, 0);
查看更多
登录 后发表回答