2009-05-26 9 views
19

Ich erstelle ics-Dateien (iCalendar oder RFC 2445 oder wie auch immer Sie sie nennen) mit einer Bibliothek, die den Inhalt in einen MemoryStream serialisiert, oder tatsächlich jede Art von Stream.FileResult mit MemoryStream gibt leere Ergebnis .. Was ist das Problem?

Hier ist mein Stück 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"); 
    } 

Mein Problem ist, dass fs einige Inhalte enthält, aber die Steuerung kehrt leere Datei - mit der richtigen MIME-Typ und den Dateinamen. Ich verpasse wahrscheinlich etwas mit dem Stream-Handling, kann aber nicht herausfinden, was.

Kann mir hier jemand helfen? Danke im Voraus.

Antwort

41

Nur eine Vermutung: Müssen Sie Seek zurück an den Anfang des Streams, bevor Sie es zurückgeben?

fs.Seek(0, 0); 
+2

Bingo! Vielen Dank. –

+1

Danke Matt! Das hat mir eine Menge Zeit gespart. So einfach, aber leicht übersehen. – 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; 
Verwandte Themen