带MemoryStream的FileResult给出空结果..有什么问题?

我正在生成ics文件(iCalendar或RFC 2445,或者你称之为),使用一个库将内容序列化为MemoryStream,或实际上任何类型的流。

这是我的一大堆代码:

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(); // 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"); } 

我的问题是fs包含一些内容,但控制器返回空文件 – 具有正确的mimetype和filename。 我很可能错过了一些关于流处理的东西,但无法弄清楚是什么。

有人可以帮帮我吗? 提前致谢。

只是一个猜测:你需要在返回之前回到流的开头吗?

 fs.Seek(0, 0); 
 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;