2009-05-26 9 views
19

estoy generando archivos ICS (iCalendar o RFC 2445 o como se les llama) usando una biblioteca que serializa el contenido de iCal en un MemoryStream, o en realidad cualquier tipo de flujo.FileResult con MemoryStream da resultado vacío .. ¿cuál es el problema?

Aquí es mi trozo 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 algún contenido, pero el controlador devuelve archivo vacío - con el tipo MIME y el nombre adecuado. Probablemente me esté perdiendo algo con el manejo del flujo, pero no puedo entender qué.

¿Alguien puede echarme una mano? Gracias por adelantado.

Respuesta

41

Sólo una conjetura: ¿Es necesario Seek de nuevo al comienzo de la corriente antes de devolverlo?

fs.Seek(0, 0); 
+2

Bingo! Muchas gracias. –

+1

Gracias Matt! Esto me ahorró un montón de tiempo. Tan básico pero fácil de pasar por alto. – jhappoldt

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; 
Cuestiones relacionadas