2009-05-26 15 views
19

Ic dosyalarını (iCalendar veya RFC 2445 veya bununla birlikte adlandırıyorsunuz) ical içeriğini bir MemoryStream veya aslında herhangi bir akış türüne serileştiren bir kütüphane kullanarak oluşturuyorum.MemoryStream ile FileResult boş sonuç verir .. sorun nedir?

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

Benim sorunum bazı içeriğe sahip fs olmakla kontrolör boş dosya döndüren - Uygun mime ve dosya adıyla:

İşte kod benim kütlesi. Muhtemelen akım işleme ile bir şeyleri özlüyorum ama ne olduğunu anlayamıyorum.

Burada kimse bana yardım edebilir mi? Şimdiden teşekkürler.

cevap

41

Sadece bir tahmin: Akışı döndürmeden önce Seek akışının başlangıcına dönmeniz gerekiyor mu?

fs.Seek(0, 0); 
+2

Bingo! Çok teşekkür ederim. –

+1

Teşekkürler Matt! Bu bana bir ton zaman kazandırdı. Çok basit ama kolayca gözden kaçan. – 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; 
İlgili konular