convert bytes c# asp.net-mvc

c# - bytes - FileResult con MemoryStream da un resultado vacío... ¿cuál es el problema?



filestream to memorystream vb (2)

Estoy generando archivos ics (iCalendar o RFC 2445 o como los llames) usando una biblioteca que serializa el contenido ical en un MemoryStream, o en realidad cualquier tipo de flujo.

Aquí está mi pedazo de código:

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

Mi problema es que fs contiene algo de contenido, pero el controlador devuelve un archivo vacío, con el tipo y el nombre de archivo adecuados. Probablemente me esté perdiendo algo con el manejo de la transmisión, pero no sé qué.

¿Alguien puede ayudarme aquí? Gracias por adelantado.


Solo una conjetura: ¿Necesita volver al inicio de la transmisión antes de devolverla?

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;